Manage personal blog in org-mode and host on Github using Hugo
This post is prepared completely in org-mode. YEAH!
从 2016 将博客迁移至 Hexo+Github 的方案后,我便一直采用此方案写博客。大体来说感受挺不错的,然而由于我有数百篇博客,build 速度永远很让我头大。尤其是有时 markdown 显示出问题了,我又得等上数分钟才能看到结果,体验很不好。所以一听说 Hugo 能一秒生成博客,哪怕要舍弃我花大功夫美化的 NeXT 主题,我依然心生向往,今天便将 Hexo 迁移至 Hugo,顺便达成了 Emacs 写博客的小目标。
安装 Hugo 并初始化
- 首先使用 Homebrew 安装 Hugo:
$ brew install hugo
- 然后建立站点
$ hugo new site blog
- 安装主题,我采用比较简单的 even 主题
$ git clone https://github.com/olOwOlo/hugo-theme-even themes/even
从 Hexo 迁移
好消息是,此迁移过程相当无痛。由于我之前将博客内容存在 Dropbox 上,所以只需要将相关文件 link 至 Hugo 的相关文件夹内。结构大致如下:
.
├── content
│ ├── about
│ │ └── index.md
│ └── post
│ ├── post1.md
│ └── ...
├── static
│ ├── images
│ │ ├── image1.png
│ │ └── ...
│ └── CNAME
...
有一个需要注意的地方是 Hexo 与 Hugo 对于 markdown 头文件中的 url 定义不同,我采用 grep
将其批量改成 slug
,并在配置文件中添加了 permalinks 的生成方式,以保证超链接的稳定:
[permalinks]
post = "/:year/:month/:slug"
生成预览
输入 hugo server
,几乎是眨眼工夫,便已在内存中生成预览,而且对于博文可即时显示改动,非常方便。确实比 Hexo 快上百倍。
| ZH-CN
+------------------+-------+
Pages | 956
Paginator pages | 139
Non-page files | 0
Static files | 85
Processed images | 0
Aliases | 254
Sitemaps | 1
Cleaned | 0
Total in 820 ms
配合 org-mode 使用更佳
以前使用 Hexo 写博客时,博文都分散于各种 .md
文件中,管理起来很不方便。另一方面,由于我平时习惯用 org-mode 记记笔记,管理生活。有了好轮子,我干脆想着一鼓作气把车换了。在此我使用的是 ox-hugo
的 One post per Org subtree 方案,配置如下:
#+HUGO_BASE_DIR: ~/Dropbox/Blog/
#+HUGO_SECTION: post
#+HUGO_WEIGHT: auto
#+HUGO_AUTO_SET_LASTMOD: t
#+author:
#+hugo_custom_front_matter: :author "ziyunch"
* Technical :@技术宅:
** TODO 博客由 Hexo 迁移至 Hugo :Emacs:Hexo:Hugo:
:PROPERTIES:
:EXPORT_FILE_NAME: 20190826-hexo-2-hugo
:END:
也就是说采用标签继承的方式,将博文分类。写完当篇博文,将 TODO
状态变更为 DONE
时, ox-hugo
会自动为文档生成时间戳。然后在 subtree 上 C-c C-e H H 即可在相应目录生成 .md
文档。此时如果后台正在运行着 hugo server
,即可在 http://localhost:1313/
看到即时更新。
在 Github 上发布
第一次部署,需要新建一个 public 文件夹,并将原来部署了 Hexo 博客的 repo 关联上,步骤如下:
$ mkdir public
$ hugo -t even
$ cd public
$ git init
$ git remote add upstream https://github.com/ziyunch/ziyunch.github.io.git
$ git add .
$ git commit -m "switch to hugo"
$ git push -f upstream master
之后则可如官网发布指南所示编写一个可执行的 .sh
文件来自动化部署发布:
#!/bin/sh
# If a command fails then the deploy stops
set -e
printf "\033[0;32mDeploying updates to GitHub...\033[0m\n"
# Build the project.
hugo -t even
# Go To Public folder
cd public
# Add changes to git.
git add .
# Commit changes.
msg="rebuilding site $(date)"
if [ -n "$*" ]; then
msg="$*"
fi
git commit -m "$msg"
# Push source and build repos.
git push upstream master
自此大功告成