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

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

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

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


当前回答

你可以使用一些git日志来帮助你:

git log --pretty=%s                 # Only prints the subject

如果你很好地命名你的分支,这样merge to master就会显示为“Merged branch feature-foobar”,你可以通过只显示该消息来缩短内容,而不显示你合并的所有小提交,这些小提交共同构成了这个特性:

git log --pretty=%s --first-parent  # Only follow the first parent of merges

您可以使用自己的脚本来增强这一点,可以做一些事情,比如去掉“合并的分支”位,规范化格式等等。当然,有时候你必须自己写。

然后你可以为每个版本创建一个新的章节:

git log [opts] vX.X.X..vX.X.Y | helper-script > changelogs/X.X.Y

然后在你的版本release commit中提交。

如果您的问题是这些提交主题与您想要放入变更日志中的内容完全不同,那么您几乎有两个选择:继续手动完成所有事情(并尝试更定期地跟上它,而不是在发布时追赶它),或者修复您的提交消息样式。

一种选择是,如果主题不打算为你做这件事,将在你的提交消息的主体中放置像“change: added feature foobar”这样的行,这样以后你就可以做一些像git log——pretty=%B | grep ^change:这样的事情来抓取那些非常重要的消息。

我不完全确定Git还能帮助您创建更改日志。也许我误解了你说的"管理"的意思?

其他回答

这是在2015年,但为了未来的搜索者,现在可以生成华丽的日志:

git log --oneline --decorate

或者,如果你想让它更漂亮(用终端的颜色):

git log --oneline --decorate --color

我目前在我的所有项目中都使用将输出输出到ChangeLog的管道,这简直太神奇了。

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 YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B

我让CI服务器为每个新版本输送以下内容到名为CHANGELOG的文件中,并在release-filename中设置日期:

git log --graph --all --date=relative --pretty=format:"%x09 %ad %d %s (%aN)"

你可以使用一些git日志来帮助你:

git log --pretty=%s                 # Only prints the subject

如果你很好地命名你的分支,这样merge to master就会显示为“Merged branch feature-foobar”,你可以通过只显示该消息来缩短内容,而不显示你合并的所有小提交,这些小提交共同构成了这个特性:

git log --pretty=%s --first-parent  # Only follow the first parent of merges

您可以使用自己的脚本来增强这一点,可以做一些事情,比如去掉“合并的分支”位,规范化格式等等。当然,有时候你必须自己写。

然后你可以为每个版本创建一个新的章节:

git log [opts] vX.X.X..vX.X.Y | helper-script > changelogs/X.X.Y

然后在你的版本release commit中提交。

如果您的问题是这些提交主题与您想要放入变更日志中的内容完全不同,那么您几乎有两个选择:继续手动完成所有事情(并尝试更定期地跟上它,而不是在发布时追赶它),或者修复您的提交消息样式。

一种选择是,如果主题不打算为你做这件事,将在你的提交消息的主体中放置像“change: added feature foobar”这样的行,这样以后你就可以做一些像git log——pretty=%B | grep ^change:这样的事情来抓取那些非常重要的消息。

我不完全确定Git还能帮助您创建更改日志。也许我误解了你说的"管理"的意思?