我已经使用Git有一段时间了,最近我开始使用它来标记我的版本,这样我就可以更容易地跟踪更改,并能够看到每个客户端正在运行的版本(不幸的是,当前的代码要求每个客户端都有自己的PHP站点副本;我正在改变这个,但它进展缓慢)。
在任何情况下,我们开始建立一些势头,我认为能够向人们展示自上个版本以来发生了什么变化是非常好的。问题是,我一直没有维护变更日志,因为我不知道如何去做。对于这个特定的时间,我可以遍历日志并手动创建一个,但这会很快让人厌倦。
我试着在谷歌上搜索“git变更日志”和“git管理变更日志”,但我没有找到任何真正谈论代码变更工作流的内容,以及它是如何与变更日志相一致的。我们目前正在遵循Rein Henrichs的开发工作流程,我希望能有一些与之相关的东西。
我是否遗漏了一个标准的方法,或者这是一个每个人都做自己事情的领域?
gitlog-to-changelog脚本可以方便地生成一个gnu风格的ChangeLog。
如gitlog-to-changelog——help所示,您可以使用任一选项选择用于生成ChangeLog文件的提交——因为:
gitlog-to-changelog --since=2008-01-01 > ChangeLog
或者在——之后传递额外的参数,它将被传递给git-log(由gitlog-to-changelog内部调用):
gitlog-to-changelog -- -n 5 foo > last-5-commits-to-branch-foo
例如,我在顶级Makefile中使用以下规则。我的一个项目:
.PHONY: update-ChangeLog
update-ChangeLog:
if test -d $(srcdir)/.git; then \
$(srcdir)/build-aux/gitlog-to-changelog \
--format='%s%n%n%b%n' --no-cluster \
--strip-tab --strip-cherry-pick \
-- $$(cat $(srcdir)/.last-cl-gen).. \
>ChangeLog.tmp \
&& git rev-list -n 1 HEAD >.last-cl-gen.tmp \
&& (echo; cat $(srcdir)/ChangeLog) >>ChangeLog.tmp \
&& mv -f ChangeLog.tmp $(srcdir)/ChangeLog \
&& mv -f .last-cl-gen.tmp $(srcdir)/.last-cl-gen \
&& rm -f ChangeLog.tmp; \
fi
EXTRA_DIST += .last-cl-gen
该规则用于在发布时使用最新的尚未记录的提交消息更新ChangeLog。“.last-cl-gen”文件包含ChangeLog中记录的最近一次提交的SHA-1标识符,存储在Git存储库中。ChangeLog也被记录在存储库中,这样就可以在不改变提交消息的情况下对其进行编辑(例如纠正拼写错误)。
我还为此做了一个库。它是完全可配置的胡子模板。能:
存储到一个文件中,如CHANGELOG.md。
发布到MediaWiki
或者直接打印到标准输出
我还做了:
一个Gradle插件
一个Maven插件
Jenkins插件
Bitbucket Server插件
命令行工具
更多详情见GitHub: https://github.com/tomasbjerre/git-changelog-lib
从命令行:
npx git-changelog-command-line -std -tec "
# Changelog
Changelog for {{ownerName}} {{repoName}}.
{{#tags}}
## {{name}}
{{#issues}}
{{#hasIssue}}
{{#hasLink}}
### {{name}} [{{issue}}]({{link}}) {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}}
{{/hasLink}}
{{^hasLink}}
### {{name}} {{issue}} {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}}
{{/hasLink}}
{{/hasIssue}}
{{^hasIssue}}
### {{name}}
{{/hasIssue}}
{{#commits}}
**{{{messageTitle}}}**
{{#messageBodyItems}}
* {{.}}
{{/messageBodyItems}}
[{{hash}}](https://github.com/{{ownerName}}/{{repoName}}/commit/{{hash}}) {{authorName}} *{{commitTime}}*
{{/commits}}
{{/issues}}
{{/tags}}
"
或者用詹金斯的话来说:
基于bithavoc,下面列出了HEAD之前的最后一个标记。但是我希望列出两个标签之间的日志。
// Two or three dots between `YOUR_LAST_VERSION_TAG` and `HEAD`
git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B
列出两个标记之间的日志:
// Two or three dots between two tags
git log FROM_TAG...TO_TAG
例如,这将列出从v1.0.0到v1.0.1的日志:
git log v1.0.0...v1.0.1 --oneline --decorate