10 May 2015
将原始的 .md 文件纳入 hexo 的版本管理
前段时间,图新鲜,以及看到 hexo 上有很多不错的主题,于是一冲动就把博客引擎由基于 ruby 的 jekyll 换成了基于 node.js 的 hexo。但是后来发现 hexo 将博客布署到 GitHub 上时,布署的是生成的 .html 文件,而非原始的 Markdown .md 文件。这就好比,一个 C++ 工程,不是对代码进行版本管理,而是对生成的二进制文件进行版本管理。这让我实在无法接受。一旦这些 .md 文件丢失了,你就再也找不回来了。
让我无法接受的第二点是,布署到 GitHub 时,这个过程是自动的,没有办法自己手动控制,比如填写 commit message。必须先填写在 _config.yml
中,这样,每次提交到 GitHub 时都要修改这个文件,真的很烦。
于是我想了一些办法,使用 hexo 的同时,也能把原始的 .md 文件和一些配置文件纳入版本管理,这样,解决了第一个问题,但第二个问题仍然无法解决。所以,后来我还是换回了 jekyll,并找到了一个相当中意的主题 – scribble。
如果你还想用 hexo,又想把原始的 .md 文件和其它文件纳入版本管理,那么可以参考我下面的方法。(我当时使用的 hexo 版本为 3.0.1)。
使用 hexo,很多人的第一个困惑就是,如何保存 README.md 文件。网上的方法是,在 source 目录下存放 README.md 文件。但这还不够,因为在进行 hexo generate
时会把 README.md 渲染成 README.html。
hexo 根目录下的 _config.yml
配置文件中,有一个叫 skip_render
的字段,在这个字段中声明的文件将不会被自动渲染成相应的其它文件 (默认 .md 会被渲染成 .html,.yml 会被渲染成 .json)。这个字段默认是以 source 目录为根目录的,所以只需这样声明即可:
skip_render: README.md # 禁止进行渲染的文件
于是,受此启发,我在 source 目录下新建了 ori_data
目录,并把想纳入版本管理的原始文件,包括 .md 和 .yml 配置文件,都放入此文件夹中,并配置好 _config.yml
中的 skip_render
字段。
我的目录结构:
D:\hexo_blog>tree source /F
文件夹 PATH 列表
卷序列号为 0C51-FB2F
D:\HEXO_BLOG\SOURCE
│ README.md
│
├─categories
│ index.md
│
├─ori_data
│ │ config.yml
│ │
│ ├─categories
│ │ index.md
│ │
│ ├─posts
│ │ 2013-02-05-my-blog-in-github.md
│ │ 2013-02-06-resolve-goagent-cp65001.m
│ │ 2013-03-11-c_stack.md
│ │ 2015-05-03-hello-hexo.md
│ │
│ ├─tags
│ │ index.md
│ │
│ └─themes
│ └─next
│ config.yml
│
├─tags
│ index.md
│
└─_posts
2013-02-05-my-blog-in-github.md
2013-02-06-resolve-goagent-cp65001.md
2013-03-11-c_stack.md
2013-03-18-understand_typdef_funp.md
2013-03-24-understand_container_of.md
2015-05-03-hello-hexo.md
_config.yml
中的配置:
...
# Directory
source_dir: source
public_dir: public
tag_dir: tags
archive_dir: archives
category_dir: categories
code_dir: downloads/code
i18n_dir: :lang
skip_render: [README.md, ori_data/*, ori_data/posts/*, ori_data/tags/*, ori_data/categories/*, ori_data/themes/next/*] # 禁止进行渲染的文件
...
这里有几点注意的。首先,skip_render
字段中可以使用通配符 *,但只可以通配该目录下的文件,而不能通配文件夹,所以每一级目录都要声明。.yml 文件也需要在 skip_render
字段中声明,否则会被渲染成 .json 文件。非 .md 和 .yml 文件不用在 skip_render
中声明,比如 .txt 文件。ori_data
目录中的文件和目录不能以 _
打头,否则会被忽略,所以我把 _config.yml
和 themes/next/_config.yml
改成了 config.yml
和 themes/next/config.yml
了,把 _posts
目录改名为 posts
。
可以这样试验,在 ori_data
目录中进行各种修改,尝试,然后运行 hexo generate
命令,查看 public 目录中的变化。
比如,我把 posts
目录改成 _posts
目录后,_posts
目录就被忽略了。
D:\hexo_blog>hexo generate
INFO Files loaded in 1.72 s
INFO Deleted: ori_data/posts/2013-03-11-c_stack.md
INFO Deleted: ori_data/posts/2015-05-03-hello-hexo.md
INFO Deleted: ori_data/posts/2013-02-06-resolve-goagent-cp65001.md
INFO Deleted: ori_data/posts/2013-02-05-my-blog-in-github.md
INFO 0 files generated in 955 ms
这样配置以后,运行 hexo generate
和 hexo deploy
,进入 .deploy_git
目录,可以看到如下目录结构。
D:\hexo_blog\.deploy_git>ls
2013 README.md categories fonts index.html tags
2015 archives css images ori_data vendors
D:\hexo_blog\.deploy_git>tree ori_data /F
文件夹 PATH 列表
卷序列号为 0C51-FB2F
D:\HEXO_BLOG\.DEPLOY_GIT\ORI_DATA
│ config.yml
│
├─categories
│ index.md
│
├─posts
│ 2013-02-05-my-blog-in-github.md
│ 2013-02-06-resolve-goagent-cp65001.md
│ 2015-05-03-hello-hexo.md
│
├─tags
│ index.md
│
└─themes
└─next
config.yml
看,.md 和配置文件都纳入版本管理了。
以后,如果发布新的文章或修改以前的文章,在 source/_posts
目录中修改,预览 OK 后,把 .md 文件复制到 source/ori_data/posts
中即可。
Baurine