Published on

hexo 更新主题的方法

Authors

我们在使用hexo安装了主题之后,后续主题作者可能会更新了主题,比如修复了bug,增加了功能等。那么这个时候我们就要想办法更新主题,最粗暴的方法就是直接删除主题,重新安装最新的,但这种方式不是用hexo写博客的精神。如果主题是托管在git上面的,那么就非常好办了。我们通过简单的git命令就可以完成更新操作了。

这里我们以目前非常流行的NexT主题为例,我们安装的时候都是通过git的方式安装的,那么我们通过git在hexo目录下面,定位到next目录,

在git中直接运行git fetch origin master先把远程分支摘取下来,如下图

我们来对比看一下远程和本地的差异,运行git diff master origin/master,如下图

接下来我们就可以进行合并操作了,运行git merge origin/master,如下图

简单的三条命令我们就完成了主题的更新操作。

需要注意的是:

我们一般都要对主题的配置文件进行修改的,所以在合并的时候一定要注意远程的修改时间和本地的修改时间,如果远程的修改时间比本地的新,比如配置文件中可能增加了新的功能,那么一定要记得备份本地的修改文件,要不然合并下来可能会被覆盖掉的。 当然,我们也可以通过更加方便的方式使用git stash或者git rebase方式来更新合并。

2016.03.25更新

当然,更好的办法还是应该是把原作者的github进行fork过来,然后在自己的本地修改git的远程分支为自己fork过来的地址,并添加upstream分支为原作者的分支。

这样,我们保留master分支上的代码一直是和upstream以及origin上的代码是同步并一致的,而自己对主题的修改刚新建的一个分支,比如叫building分支,这样,当主分支有了更新之后,我们也能够安全地进行合并,如果我们自己想对主题进行比较好的修改,那么我们可以在主分支上面,再新建的一个dev分支,添加功能之后,还可以向原作者进行pull request,这样也可以贡献我们自己的代码了。

比如我的实际操作,在github上fork完毕原作者的主题之后:

因为我之前对主题文件的配置进行了修改,所以我先把配置文件保存出来,因为我不需要合并,我需要把master分支保证和源分支一致。

首先,丢弃我对主题的修改

git reset --hard HEAD

修改远程地支的地址为自己fork之后的,

git remote origin set-url git@github.com:buxuku/hexo-theme-next.git

当然,这一步我们也可以先删除远程分支再添加的方式

git remote rm origin 
git remote add origin git@github.com:buxuku/hexo-theme-next.git 

或者直接修改config配置文件

然后添加原作者的远程分支

git remote add upstream git@github.com:iissnan/hexo-theme-next.git

同步原作者的分支

git fetch upstream

合并到master分支

git merge upstream/master

push到自己的github上面

git push origin master

添加自己写博客需要的一个分支

git checkout -b building

然后尽情地修改自己的配置文件,主题什么的,尽情享受写作的乐趣吧

修改完毕之后,git commit之后,我们再git push origin building推送到自己的远程目录。

当我们换电脑之后,全新安装hexo,进入theme目录,克隆我们的远程仓库

git clone git@github.com:buxuku/hexo-theme-next.git next

和上面一样,添加upstream分友

下载我们的building分支

git checkout -b building origin/building
git checkout master

检查更新,合并更新,合并更新到building分支

git fetch upstream
git merge upstream/master
git push origin master
git checkout building
git merge master
git push origin building

扩展阅读

Syncing a fork :https://help.github.com/articles/syncing-a-fork/ Configuring a remote for a fork :https://help.github.com/articles/configuring-a-remote-for-a-fork/