在不同机器上维护 hexo github blog 的方法和坑

常规的更新文章或者更新主题之类的方法就不写了。由于是托管在 GitHub 上的 hexo 博客,不像是一般部署在一台固定机器上的 WordPress 那样从哪里都可以 ssh 上去管理。因此有必要记录一下摸索出来的过程。

方法

主要是因为 hexo 实现 github blog 是通过 source/ 下一系列的 markdown 文件用于记录文章内容,再通过 hexo g 命令生成美观的静态页面在浏览器中显示,两者是缺一不可的:如果只有 markdown 文件,也不是不能读,但这样和读 README.md 没什么区别了,起不到博客的作用;如果只有静态页面文件,倒是像个博客了,但是如果要更新,改一次就累死人了。按照我的理解,前者相当于源码,后者相当于由源码编译出来的二进制文件,因此要两手抓,两手都要硬,通过两个分支来对整个 hexo github blog 进行管理就可以了。

在写完 markdown 文件之后,执行一下 hexo clean,把已经生成的静态页面文件都清理掉(据我理解实际上是把 public/ 删掉了,但不确定除此以外还有没有清理其它内容)。这个时候目录下的内容基本都是“源码”了,将这个状态下的整个目录 git push 到项目的某个次要分支。之后都是通过这个次要分支来维护每次更新,只要在 git clone 下来之后 git checkout 到这个分支就可以了。

维护完次要分支之后,就可以使用 hexo g 来生成静态页面文件了,这个过程视机器性能而定,快则几秒钟,慢则几分钟,在我的 VPS 上甚至有可能被 kill……在生成完静态页面文件之后,就可以直接部署到 GitHub 上了。前提是要有 hexo-deployer-git 这一个插件并且在配置文件里已经配置好 GitHub 的用户名和分支(这里需要用 master 分支),执行 hexo d 就可以直接部署上去了。这个过程的实质是把 public/ 里面的内容 push 到 master 分支了。

这样,静态页面文件通过 master 分支维护,访问者访问 foo.github.io 时访问的也是 master 分支的静态页面文件,而 markdown 文件则隐藏在次要分支的 source/ 中。

  • 主题目录文件丢失:如果是使用 next 之类的从 GitHub 上 clone 下来的主题,那么主题目录下就会有 .git 目录,而整个项目根目录也有一个 .git 目录,这就会导致在 push 到 GitHub 的时候会忽略掉整个主题目录的文件,下一次 clone 下来的时候主题目录就是空的了。解决方法:移除主题目录中的 .git* 目录/文件,避免出现嵌套 git 的情况。

  • hexo d 将整个项目根目录 push 到 master 分支:这种情况一般是在不同的位置(包括不同机器,或者同一台机器的不同目录)clone 项目导致的。在项目根目录下会有 .deploy_git/,这个目录下的内容和 public/ 一样,在这种情况下会产生混乱。解决方法:在 hexo clean 之前把 .deploy_git/ 目录删除,余下步骤照常执行。

  • 更新内容后成功部署,但刷新页面不更新:由于是静态页面,因此浏览器会使用缓存。解决方法:ctrl + F5 刷新即可。