始末

在看到曹大的一篇微信文章,是读书的一篇总结,其中就有写到关于Change log文档的问题,文章中有提到说国外很多开源项目,都是根据commit自动维护的,而国内还没有普及这种。

我感觉这个倒是触及了我的知识盲区的,之前确实没了解过,借此我去研究了一下,亲身尝试下来,还是挺方便的。

例如:openui5,可以非常方便的在网页中查看release note,releasenotes

Git 命令

既然国外都有很多在这样做了,那这方面的资料绝对不少,果不其然:

Generating release notes from git commit messages using basic shell commands (git/grep)

根据特定的Label进行聚合,查询tag与tag之间的提及。

1
2
3
4
5
6
7
#[INTERNAL]用于内部项目的修改,比如自己的internal包git commit -m“[INTERNAL] my internal change” 

#[FIX]修补buggitcommit-m“[FIX] my fix change”

#[FEATURE]新功能(feature)git commit -m“[FEATURE] my new feature”

#[DOC]文档(documentation)git commit -m“[DOC] my documentation change”

使用命令:

1
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%s" -i -E --grep="^(\[INTERNAL\]|\[FEATURE\]|\[FIX\]|\[DOC\])"

仅导出特定的Label

1
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%s" -i -E --grep="^(\[INTERNAL\]|\[FEATURE\]|\[FIX\]|\[DOC\])*\[FEATURE\]"

指定两个Label

1
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%s" -i -E --grep="^(\[INTERNAL\]|\[FEATURE\]|\[FIX\]|\[DOC\])*\[FEATURE\]|\[FIX\]"

$(git describe --tags --abbrev=0)…HEAD

$(git describe --tags --abbrev=0):提取最近的一次tag

HEAD:则是最新的Commit

此段含义:最近的tag到最新的Commit的期间

也可以直接指定,v0.0.01…v1.0.01


正则的解释:

grep先获取到整体以Label开头的commit log,包含多个Label都可以(正则的*),例如[INTERNAL][TEST],后一部分再把特定部分的Label捞出来。

为什么要这么做呢?

当我们获取:--grep="^(\[FEATURE\])"时,我们获取到:

1
2
[FEATURE] Supports display of system and app information on Generic Tile
[FEATURE] sap.m.IconTabBar: Icons can now be added to IconTabFilters

像这种commit是获取不到的:

1
[INTERNAL][FEATURE] sap.m.MultiComboBox: Keyboard Handling aligned

^(\[INTERNAL\]|\[FEATURE\]|\[FIX\]|\[DOC\])*则会将如下信息也一并获取到,其并不是我们所想要的。

1
2
Merge "[INTERNAL] server: Update npm dependencies and enable CSP target level 3"
Merge "[FIX] core.routing.history: stablize the test by using timeout between actions"

而使用^(\[INTERNAL\]|\[FEATURE\]|\[FIX\]|\[DOC\])*\[FEATURE\],则可以先获取到以Label开头的commit,再把所有包含[FEATURE]的commit一并抓取到。

Commit Template

通过Label聚合,那有时候在commit的时候并不知道这些Label,那可以借助commit模板来达成这个提醒的目的。

1
2
3
4
5
6
7
git config --global commit.template /home/yu/git-commit-template.txt 

# git-commit-template.txt 内容
#[INTERNAL]用于内部项目的修改,比如自己的internal包git commit -m“[INTERNAL] my internal change”
#[FIX]修补buggitcommit-m“[FIX] my fix change”
#[FEATURE]新功能(feature)git commit -m“[FEATURE] my new feature”
#[DOC]文档(documentation)git commit -m“[DOC] my documentation change”

这个文件是要一直存在的,否则git会找不到。

git commit时,如图中效果:

栗子

其他

果不其然,Github有现成的工具,也更为强大的工具:

https://github.com/search?q=Changelog

https://github.com/git-chglog/git-chglog

https://github.com/Songmu/ghch