始末

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

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

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\]"

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

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

HEAD:则是最新的Commit

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

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

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