现在写这篇文章的时候,我使用的一个叫 [雪](https://github.com/xzhuz/halo-theme-xue) 的主题,页脚可以自定义一些社交网络,可是没有B站,我打算加一个上去。为了以后还有其他的自定义需求,我clone了原项目,打算自己维护一个版本。
本来想着还是蛮简单,不就改改提交,然后原作者加了新的功能可以的话就一并拉过来,自己也可以在halo后台这里更新,结果我整了好久,头都快炸了,看了下halo下源码才发现原因,这篇文章记录下我遇到的问题和我的解决方法。
---
最开始我直接拉了原作者的代码,然后打算加了个图标上去,原来的项目使用的自定义的 iconfont,所以我找了半天怎么添加字体上去,最后找到了百度的一个工具 [FontEdit](https://kekee000.github.io/fonteditor/index.html#) 可以导入 `ttf` `woff` `woff2 `的字体进去编辑导出,我从阿里的 iconfont下了个b站的svg的图标导入就行了。
![image.png](https://s2.loli.net/2022/03/06/VvPrKgM9qlwFbJ2.png)
然后遇到的第二个问题,我导入新的字体之后又发现样式不对,又改了样式,这下终于行了吧。于是就提交到了我的git,把原服务器上的主题删除拉取我这个主题。因为 halo 的主题是根据id区分的,也就是你主题下面的 'theme.yaml' 中的id,所以主题文件夹的名字是啥无所谓的,但是后续更新halo还是会把你的主题文件夹名称改成id名的
```yml
#像是这样
id: bao
name: 雪
author:
name: 雪
website: https://baozi.fun
description: 大道至简
logo:
website: https://github.com/xzhuz/halo-theme-xue
repo: https://github.com/xzhuz/halo-theme-xue
version: 1.3.2
require: 1.5.0
```
上传之后试了下效果,的确可以呀,然后我点了下更新主题,看看可不可以正常从我的仓库更新,然后更新后主题又还原了,给我人整傻了,我以为他又从原作者的仓库拉代码了,检查了几遍数据和日志,确认没问题呀,后来有趣翻了代码,终于知道是怎么回事。
原来,`halo`拉取主题之后,并不会直接使用,`halo` 的主题配置中是可以设置代码分支的,默认为 `master`,拉取代码后首先切换到指定分支,然后寻找最新的 `tag`,重置代码到最新的 `tag` , 而不是直接使用当前分支的代码,这就导致我的修改被恢复成原样了,我还找了半天原因。 因为`halo`是有主题编辑功能的,`halo`还会提交了当前编辑的修改(这点设计还蛮巧妙,后续修改可以一直保留,除非有了冲突),然后合并新的代代码,创建一个叫 halo的新分支。
![image.png](https://s2.loli.net/2022/03/06/kFUHf3KIaQhqBNT.png)
还有一个蛋疼的事情了,我发现我的博客内容点击去不显示,看了下模板文件,原来的模板文件使用的是 `post.originalContent` 来作为的文章内容,新的使用的是 `post.content`,现在的 halo 模板里根本就没这个变量,所以也就没有显示了。 原作者最新的代码是根据 halo `1.5` 开发的,我现在还是 `1.4`,`1.5` 目前还是 beta, 怪不得我之前的主题显示有很多错乱,我都一个个改过来了,浪费我不少时间。升级beta是肯定不可能的,所以我决定在原作者的上个版本创建一个新的分支,进行我的修改。
下面具体说下。
首先就是按照 halo 的思路,作者的上个版本是 ·1.3.1` 是针对我现在的halo版本,我打算使用这个版本二开,如果后续我升级了新版本的话,我可以再合并最新的修改。
使用git tag可以查看当前有哪些tag,恢复到 1.3.1 那个 tag
```shell
git tag
```
使用下面的命令在指定tag上创建一个新分支
```shell
#git checkout tags/{tag} -b {分支名称}
git checkout tags/v1.3.1 -b dev-1.3.1-thetbw
```
然后进行好我的修改之后我又创建了一个新的分支,用来作为我的主分支,因为原作者的提交都是比我新的,所以我的代码是不能向他的代码合并的,要他的代码向我这边合并。
创建之后最后一步,如果你已经打算部署了,千万要打一个标签,
使用
```shell
git tag -a 标签名
```
因为 halo 的更新是使用的最新的标签,你不打标签的话,又要恢复到原来的代码了。
还有一点,因为我是启用了新的分支,所以主题上需要指定分支,而不是使用默认的`master`,因为原来的是`master`,halo 拉取代码时候也一定是 master,我现在的分支就不能生效,所以这里只能重新拉取我自己的代码,然后手动的切换到我自己的分支,为了防止其他冲突,我把主题id也改了一下。
---
现在总结一下
目前总共有4个分支
* master `原作者的`
* dev-1.3.2 `原作者的`
* thetbw-xue `我的主分支,也是我目前使用的分支 从dev-1.3.1-thetbw创建`
* dev-1.3.1-thetbw `从原作者的1.3.1标签创建`
后续的开发流程就是,我自己的流程在 ·dev-*.*.*-thetbw· 上开发,然后`merge` 到 `thetbw-xue` 分支, 如果作者后续有更新的话,就 从 `master` 分支 `merge` 到我的开发分支 `dev-*.*.*-thetbw`,我的分支应该大部分都要比作者旧,然后我修改好之后再推到我的 `thetbw-xue`, halo拉取 主题的时候,因为我在主题文件中配置了 分支为 `thetbw-xue`,所以每次都会切换到我的分支。
---
忙活了半天,我美好的周末就这么没,主要是好了好多时间在查找代码怎么恢复了的问题上,不过也学到了一点东西,比如 git 的操作又熟练了一点,还有就是发现 halo 的代码也是蛮短小精悍的,这次折腾完下次也就轻车熟路了!
记一次halo主题二开的过程