使用gitpipe理更新日志的好方法?

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

无论如何,我们正在开始build立一些动力,我认为能够向人们展示自从上次发布以来发生了什么变化是非常好的。 问题是,我没有保持更新日志,因为我不知道如何去做。 在这个特定的时间里,我可以运行日志并手动创build一个,但是这会很快就累人。

我试着用googlesearch“git changelog”和“git manage changelog”,但是我没有发现任何真正谈到代码改变的工作stream程以及如何与改变日志相吻合的事情。 我们目前正在关注Rein Henrichs的开发工作stream程,而且我会喜欢与之相关的东西。

有没有一个标准的方法,我错过了,或者这是一个每个人都做自己的事情?

非常感谢您的意见/答复!

这是大约3 – 4年前,但为了未来的search者,现在可以生成华丽的日志:

git log --oneline --decorate 

或者,如果你想要它更漂亮(与terminal的颜色):

 git log --oneline --decorate --color 

输出到ChangeLog的pipe道是我目前在我的所有项目中使用的,这真是太神奇了。

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

 git log --pretty=%s # only print the subject 

如果你很好地命名你的分支,这样一个合并到主人显示为“合并分支functionfoobar”,你可以缩短东西只显示该消息,而不是所有的小提交你合并,形成特征:

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

你也许可以用自己的脚本来增加这个function,比如去掉“合并分支”位,规范化格式等等。当然,在某些时候你必须自己写。

然后,您可以为每个版本的更改日志创build一个新的部分:

 git log [opts] vX.XX.vX.XY | helper-script > changelogs/XXY 

并在您的版本发布提交中提交。

如果您的问题是这些提交主题与您想要在更改日志中进行的操作不同,那么您几乎可以select两种方式:手动执行所有操作(并且尽可能更经常地跟上,在发布时间),或修正你的提交消息风格。 一个选项,如果主题不打算为你做,将在你的提交消息的主体中放置“change:added feature foobar”这样的行,以便以后你可以做一些事情,比如git log --pretty=%B | grep ^change: git log --pretty=%B | grep ^change:只抓取消息中那些超级重要的位。

我不完全确定这个git能够帮助你创build更新日志。 也许我误解了你的意思是“pipe理”?

免责声明:我是gitchangelog的作者,我将在下面发言。

TL; DR:您可能需要检查gitchangelog自己的更改日志或生成前一个的ascii输出 。

如果你想从你的git历史logging中生成更新日志,你可能需要考虑:

  • 输出格式 。 (纯自定义ASCII,Debian更新日志types,Markdow,ReST …)
  • 一些提交过滤 (你可能不希望看到你的更改日志中的所有拼写错误或外观变化)
  • 一些提交文本之前被包含在changelog中。 (确保消息标准化为第一个字母大写或最后一个点,但也可能会删除摘要中的一些特殊标记)
  • 你的git历史是否兼容 ? 合并,标记并不总是很容易被大多数工具所支持。 这取决于你如何pipe理你的历史。

Optionaly你可能想要一些分类(新的东西,变化,错误修正)…

考虑到这一切,我创build并使用了gitchangelog 。 这意味着利用git commit消息约定来实现所有以前的目标。

有一个提交消息约定是强制性的创build一个很好的更新日志(使用或不使用gitchangelog )。

提交消息约定

以下是关于如何考虑添加提交消息的build议。

你可能想粗略地把你的提交分成几大部分:

  • 通过意图(例如:新的,修复,改变…)
  • 按对象(例如:doc,包装,代码…)
  • 由受众(例如:开发人员,testing人员,用户…)

另外,你可能想要标记一些提交:

  • 作为“次要”的承诺,不应该输出到你的更新日志(整容变化,评论中的小错字…)
  • 作为“重构”,如果你真的没有任何有意义的function改变。 因此,这不应该是最终用户显示的更改日志的一部分,但如果您有开发人员更改日志,则可能会引起一些兴趣。
  • 你也可以使用“api”来标记API更改或新API的东西…
  • …等等…

尝试通过尽可能频繁地定位用户(function)来编写提交信息。

这是标准的git log --oneline来显示如何存储这些信息::

 * 5a39f73 fix: encoding issues with non-ascii chars. * a60d77a new: pkg: added ``.travis.yml`` for automated tests. * 57129ba new: much greater performance on big repository by issuing only one shell command for all the commits. (fixes #7) * 6b4b267 chg: dev: refactored out the formatting characters from GIT. * 197b069 new: dev: reverse ``natural`` order to get reverse chronological order by default. !refactor * 6b891bc new: add utf-8 encoding declaration !minor 

所以如果你注意到了,我select的格式是:

 {new|chg|fix}: [{dev|pkg}:] COMMIT_MESSAGE [!{minor|refactor} ... ] 

要查看实际的输出结果,可以查看gitchangelog的PyPI页面的末尾

要查看我的提交消息约定的完整文档,您可以看到参考文件gitchangelog.rc.reference

如何从中产生精美的更新日志

然后,做一个完整的更新日志是很容易的。 您可以快速制作自己的脚本,或使用gitchangelog

gitchangelog将会生成一个完整的更新日志(带有NewFix …的gitchangelog支持),并且可以合理地configuration到你自己的提交约定中。 它支持任何types的输出感谢模板通过MustacheMako templating ,并有一个默认的原始python编写的遗留引擎; 所有当前的3个引擎都有如何使用它们的例子,并且可以输出changelog作为在gitchangelog的PyPI页面上显示的那个。

我确定你知道还有很多其他的git log来更新changelog工具。

更重要的是CHANGELOG。 告诉我你是否喜欢它。

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

gitlog-to-changelog脚本可以方便地生成一个GNU风格的ChangeLog

gitlog-to-changelog --help ,您可以使用选项--since来select用于生成ChangeLog文件的--since

 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.am中使用以下规则:

 .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 

此规则在发布时使用,以使用最新尚未logging的提交消息来更新ChangeLog 。 文件.last-cl-gen包含ChangeLoglogging的最新提交的SHA1标识符,并存储在Git存储库中。 ChangeLog也被logging在存储库中,以便它可以被编辑(例如纠正拼写错误)而不用改变提交消息。

由于为每个版本创build标签是最佳做法,因此您可能需要对每个版本的更改日志进行分区。 在这种情况下,这个命令可以帮助你:

 git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B 

对于GitHub项目,它可能是有用的: github-changelog-generator

它从标签closures问题和合并拉取请求生成更新日志。

这个CHANGELOG.md是由这个脚本生成的。

例:

更新日志

1.2.5 (2015-01-15)

完整的更新日志

已实施的增强function:

  • 使用里程碑来指定哪个版本的bug已修复#22

修正了错误:

  • 尝试生成没有标签#32的日志时发生错误

合并请求:

  • PrettyPrint类包含使用小写'pp' #43 ( schwing )

  • 通过命令行选项支持企业github #42 ( glenlovett )

我也为此做了一个图书馆。 它是完全可configuration的小胡子模板。 这样可以:

  • 存储到文件,如CHANGELOG.md 。
  • 张贴到MediaWiki
  • 或者只是打印到STDOUT

我也做了:

  • 一个Gradle插件
  • 一个Maven插件
  • jenkins插件
  • 一个Bitbucket服务器插件
  • 一个命令行工具

Github上的更多细节: https : //github.com/tomasbjerre/git-changelog-lib

在这里输入图像说明

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

是我喜欢用的。 它从最后一个标签获得所有提交。 cut摆脱了提交散列。 如果您在提交消息的开始处使用故障单号码,则会按sort进行分组。 sorting也有助于如果你前缀某些提交fixtypo

基于bithavoc ,它列出了直到HEADlast tag 。 但我希望列出2个标签之间的日志。

 // 2 or 3 dots between `YOUR_LAST_VERSION_TAG` and `HEAD` git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B 

列出2个标签之间的日志。

 // 2 or 3 dots between 2 tags git log FROM_TAG...TO_TAG 

例如,它会列出从v1.0.0v1.0.1日志。

 git log v1.0.0...v1.0.1 --oneline --decorate 

对于一个GNU风格的更新日志 ,我已经完成了这个function

 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 } 

有了这个:

  • 我会定期进行修改,以便在对ChangeLog进行最终编辑之前进行备份和重新绑定
  • 然后运行: gnuc

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

 2015-07-24 John Doe <john.doe@gmail.com> * gdb/python/py-linetable.c (): . * gdb/python/py-symtab.c (): . 

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

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

更高级的脚本:

但我必须同意Tromey:在ChangeLog中复制git commit数据是没用的。

如果您要制作更新日志,请对发生的事情做一个很好的总结 ,可能是在http://keepachangelog.com/上指定的。;

我让CI服务器将以下内容CHANGELOG到一个名为CHANGELOG的文件中,每个新版本的release-filename都设置了date:

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