我已经使用Git有一段时间了,最近我开始使用它来标记我的版本,这样我就可以更容易地跟踪更改,并能够看到每个客户端正在运行的版本(不幸的是,当前的代码要求每个客户端都有自己的PHP站点副本;我正在改变这个,但它进展缓慢)。

在任何情况下,我们开始建立一些势头,我认为能够向人们展示自上个版本以来发生了什么变化是非常好的。问题是,我一直没有维护变更日志,因为我不知道如何去做。对于这个特定的时间,我可以遍历日志并手动创建一个,但这会很快让人厌倦。

我试着在谷歌上搜索“git变更日志”和“git管理变更日志”,但我没有找到任何真正谈论代码变更工作流的内容,以及它是如何与变更日志相一致的。我们目前正在遵循Rein Henrichs的开发工作流程,我希望能有一些与之相关的东西。

我是否遗漏了一个标准的方法,或者这是一个每个人都做自己事情的领域?


当前回答

基于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

其他回答

一个更切题的更新日志:

git log --since=1/11/2011 --until=28/11/2011 --no-merges --format=%B

我还为此做了一个库。它是完全可配置的胡子模板。能:

存储到一个文件中,如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}}
"

或者用詹金斯的话来说:

GNU风格变更日志

对于GNU风格的更改日志,我已经烹煮了这个函数:

gnuc() {
  {
    printf "$(date "+%Y-%m-%d")  John Doe  <john.doe@gmail.com>\n\n"
    git diff-tree --no-commit-id --name-only -r HEAD | sed 's/^/\t* /'
  } | tee /dev/tty | xsel -b
}

用这个:

我定期将我的更改提交到备份中,并在对更改日志进行最终编辑之前重新编制它们 然后执行:gnuc

现在我的剪贴板包含如下内容:

2015-07-24  John Doe  <john.doe@gmail.com>

        * gdb/python/py-linetable.c (): .
        * gdb/python/py-symtab.c (): .

然后使用剪贴板作为更新ChangeLog的起点。

这并不完美(例如,文件应该相对于它们的ChangeLog路径,所以python/py- symtable .c没有gdb/,因为我会编辑gdb/ChangeLog),但这是一个很好的起点。

更高级的脚本:

GDB维护者Tromey的git-gnu-changelog GCC的contrib / mklog gcc / contrib / mklog

不过我不得不同意Tromey的观点:在更新日志中复制Git提交数据是没有用的。

如果你打算做一个变更日志,那就对正在发生的事情做一个很好的总结,可能就像Keep a changelog中指定的那样。

git log --oneline --no-merges `git describe --abbrev=0 --tags`..HEAD | cut -c 9- | sort

是我喜欢用的。它获得自最后一个标记以来的所有提交。Cut去掉了提交散列。如果您在提交消息的开头使用票号,则它们将按sort进行分组。如果你在某些提交前加上fix、typo等前缀,排序也会有帮助。

基于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