Home

Baurine's Blog

Work hard, Enjoy life.

Blog GitHub New Blog

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.ymlthemes/next/_config.yml 改成了 config.ymlthemes/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 generatehexo 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

scribble