用git同步hexo文章

hexo写作有个问题就是换机器时如何同步。网上有很多文章用dropbox实现的。
相对而言我还是git更熟悉些,所以选择用git在不同机器间同步文章和配置。
而且hexo init后还自动生成了一个.gitignore,说明hexo默认也是偏向于git的。

场景:在一台全新的机器上写blog,步骤尽量简化。

一些准备工作

git中央仓库

既然是在不同机器间协作,就必须要有个中央仓库。
考虑过GitHub,但private的repo要付费,$7/month为了一个blog还是有些贵。
正好有个linode的VPS,不如自己搭建一个中央仓库。

考虑过GitLab,但安装配置太复杂。
GitBucket部署倒是非常简单,直接扔到tomcat里就好了。

但后来仔细想了下,我不需要多人协作,只需要一个人在不同机器间协作,根本不需要这种大型的git管理界面。
只要在VPS上建个repo就好了。git本身就是去中心化的,不同repo之间直接push/pull即可。很多人用git时往往忘了这点,把git当svn来用。

在我的VPS上执行:

# 我在linode的管理界面上单独建一个分区用于放git的repo
sudo mount /dev/xvdc git-repo
sudo chown foolbear git-repo
cd git-repo
git --git-dir=blog.git init --bare
git --git-dir=hexo-theme-next.git init --bare

这样blog.git和hexo-theme-next.git两个repo就可以作为中央仓库了。
git默认的配置下只能向bare的repo执行push操作。非bare的会报错,可以改个什么配置。这里不细说了。

添加公钥

将所有机器的公钥加入VPS的~/.ssh/authorized_keys。
比如我要在自己的笔记本上和公司的pc上写blog,就把这两台机器的公钥加进去。如果git用的公钥和机器本身的不同,还要把git的公钥加进去。
可以ssh验证下

# foolbear.me是绑定到VPS上的域名,8086是我自定义的端口
ssh foolbear@foolbear.me -p 8086

将已有的文章push到中央仓库

以前我一直是在自己的thinkpad上写blog的,现在要push到中央仓库,才能从公司的pc上clone。
这里有个问题,hexo的主题也是单独的repo,blog本身也是单独的repo。所以要用到git的submodule功能。
先处理主题:

# 先从github上把我要用的主题clone下来
git clone git@github.com:iissnan/hexo-theme-next.git
cd hexo-theme-next
# 新建一个分支foolbear,因为我对这个主题有一些自定义的改动
git branch foolbear
git checkout foolbear
// 一些自定义的修改,然后提交
# 把foolbear分支push到linode上
git remote add linode ssh://foolbear@foolbear.me:8086/home/foolbear/git-repo/hexo-theme-next.git
git push -u linode foolbear

以后我要用这个主题时,直接clone在VPS上的hexo-theme-next.git,然后check out foolbear分支就好了。

下面处理blog本身:

# 先git init
cd blog
git init
# 添加submoudle,指定foolbear分支
git submodule add --branch foolbear ssh://foolbear@foolbear.me:8086/home/foolbear/git-repo/hexo-theme-next.git themes/next
# commit的过程省略,接下来push到中央仓库
git remote add linode ssh://foolbear@foolbear.me:8086/home/foolbear/git-repo/blog.git
git push -u linode master

至此,准备工作全部完成。

在新机器上写blog

安装git/node/npm/hexo的过程不赘述了,参考以前的文章
只需要如下几个步骤:

# 先从VPS上clone出来
git clone ssh://foolbear@foolbear.me:8086/home/foolbear/git-repo/blog.git
# 然后更新submodule,子模块会自动从VPS上clone出来
git submodule init
git submodule update
# 根据package.json安装一些hexo必要的模块
npm install

之后就可以开始写blog了,和普通的hexo操作是一样的。

同步新文章

最基础的git push/pull操作:

# 在公司的pc上写好文章后
git add xx.md
git commit -m "xxx"
git push

# 在笔记本上同步
git pull

一些问题

hexo最近升级到3.0,我还用的2.8.3。新版本的一些模块不兼容2.8.3,导致编译文章时出错。
修改package.json,强制限定模块的版本,不要用最新版:

{
“name”: “hexo-site”,
“version”: “2.8.3”,
“private”: true,
“dependencies”: {
“hexo-generator-feed”: “^0.2.1”,
“hexo-generator-sitemap”: “^0.2.0”,
“hexo-renderer-ejs”: “^0.1.0”,
“hexo-renderer-marked”: “^0.1.0”,
“hexo-renderer-stylus”: “^0.1.0”
}
}

之后删掉node_modules目录,重新npm install即可。
不要忘了把修改后的package.json push到中央仓库。