前言
关于如何根据代码的提交记录自动生成changelog, 网上其实是有一些方案的, 也有一些现成的工具, 我也上网了解过, 也视图使用他们, 但是看过之后感觉还是有些麻烦了, 于是就想自己来实现一下, 现将思路提供一下, 相应的工具就先不提供了, 因为还在使用阶段.
思路
首先, 我们生成changelog是基于commit的, 不是基于merge, 因为merge信息的获取需要使用gitlab提供的API, 不如获取commit来的方便. 我看现在网上提供的方案也都是基于commit的, 所以我们也基于commit来实现.
获取commit信息简直不要太简单, 打开git bash, 然后'git log > log'一条命令就ok了, 我们后面就是基于这里生成的log文件来进行.
log文件里面保存了所有的commit信息, 包括id, author, date以及comment等, 我们的思路就是对log文件进行格式化处理, 提取我们关心的信息, 然后组织成changelog文件.
思路其实很清晰, 也很简单, 这里的难点主要有二:
一是技术上的, 那就是如何处理log文件, 然后格式化成changelog. 这个问题说难也难, 说简单也简单, 我们就简单来说, 如果我们的commit格式都是统一的, 那么我们处理起来就简单多了, 不需要关心内容, 只需要根据固定的格式从中copy信息即可, 因为我们做的就是格式上的处理, 不关系内容, 但如果每次commit的格式都不同, 那我们也就无从处理了, 这也是目前网上提供的方案中为什么要求commit按照固定的规范进行的原因.
第二点是基于第一点产生的, 那就是我们使用git管理代码, 重要的一点就是协同开发, 那么我们如何能保证每个成员, 每次的commit的格式都一样呢? 有朋友说了, 我们制定个commit规范不就行了, 部门内部的, 人员不多应该好执行. 不错, 这是一种方法, 但是我们不能百分百保证每个人都能严格执行, 而且你规定的格式未必就能足够简单到让短时间内就能记住. 所以我们需要想一个更好的解决办法, 这个问题解决了, 那我们的问题其实基本就解决了, 因为第一个技术上的问题其实要简单的多.
解决方案
- 如何保证所有成员的每次commit格式保持格式一致?
答: 使用模版来解决. 我们可以做一个commit模版, 让所有参与开发的成员都配置一下, 统一使用此模版进行commit操作, 这样就能保证commit的格式一致了, 而且只需要一次简单的配置, 不用去记烦杂的格式要求. - 如何将log文件转换成changelog?
答: 方法有很多, 你只要会一种可以处理文件的编程语言就可以轻松搞定了. 我使用的是python, 对文本逐行进行处理, 判断模版中的格式然后进行相应的处理.
比如我们的模版第一行是 '[标签]标题', 那我处理的时候就判断第一个字符为'[', 然后直接copy到changelog, 或者在其前面加上 '##'(markdown格式化), 类似这样我们就能很方便的处理log文件了.(当然, 这只是一个简单的例子, 针对需求比较简单的朋友, 需求复杂者请自行考虑方法).
gitlab配置commit模版很简单, 我参考的是这篇文章, 说明如下:
- 首先你需要定义一个模版, 这里我们用markdown格式, 因为changelog也是markdown格式. 在自己的工程下创建一个模版文档, 比如commit_template.md, 可以在根目录下, 也可以自己定义路径, 记住路径就行.
- 如果你习惯试用图形界面进行commit操作, 比如使用tortoisegit, 那么你只需要在git bash中执行如下命令即可, 然后提交的时候就有模版了.
git config --global commit.template ./path/commit_template
- 如果你习惯试用命令行进行commit操作, 那么你还需要配置一个文档编辑器, 比如vim, 配置如下:
git config --global core.editor vim
如此就配置好了, 以后每次commit只需要在模版中填写提交内容就可以了.
等需要生成changelog的时候, 执行一下你写的文档处理工具(包含git log > log命令哈), 一切ok.
注: 用python进行文件处理还是挺方便的, 可以使用正则, 有现成的切片函数等, 一开始运行一下git log >log, 然后打开log文件一顿操作猛如虎, 最后生成changelog, 哈哈, 如果你不想自己动手可以给我留言, 我给你发我的, 当然模版也是按我的来的哈.
最后
如果这篇文章对你有一点帮助的话, 还请给点一个赞哦.
网友评论