使用git管理更改日志的好方法?

Top*_*gio 202 git github changelog

我一直在使用Git一段时间了,我最近开始用它来标记我的版本,以便我可以更容易地跟踪更改并能够看到每个客户端正在运行的版本(遗憾的是代码目前要求每个客户都有他们自己的PHP站点副本;我正在改变它,但它很慢).

无论如何,我们开始建立一些动力,我认为能够向人们展示自上次发布以来发生了哪些变化真的很棒.问题是,我没有维护更改日志,因为我不知道如何去做.在这个特定的时间里,我可以浏览日志并手动创建一个,但这会很快累.

我尝试使用谷歌搜索"git changelog"和"git manage changelog",但我没有找到任何真正谈论代码更改工作流程的内容以及与更改日志一致的内容.我们目前正在关注Rein Henrichs的开发工作流程,我很喜欢与之相关的东西.

我缺少一种标准方法,或者这是一个每个人都做自己的事情的领域?

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

小智 169

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

git log --oneline --decorate
Run Code Online (Sandbox Code Playgroud)

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

git log --oneline --decorate --color
Run Code Online (Sandbox Code Playgroud)

将输出管道输出到ChangeLog是我目前在所有项目中使用的,它简直太棒了.

  • 我强烈建议不要使用礼物日志差异作为CHANGELOG:http://keepachangelog.com (39认同)
  • 这样做的问题在于,即使假设项目的每个贡献者都写出清晰可读的提交消息,您仍然会生成包含大量噪声的"更改日志".应该编写更改日志,目的是向项目的*users*解释发布之间发生的*与*相关的*显着*更改*,而提交消息应该集中在向*开发人员解释*您的提交所做的改进*到代码*.有时那里有重叠,但并非总是如此. (16认同)
  • 或者,为了使这更具体一点,这个方法将创建一个"更改日志",其中包含许多条目,如"在ZModule中修复fooMethod拼写"和"使用新版XYLibarary重构XModule".您的用户*不关心*.他们想知道从*他们*的角度做了哪些改变作为用户,而不是*你作为开发人员的*视角.而这甚至忽略了诸如"从xdev/foo合并PR#123"和"Opps,修复newFeature以便实际工作"之类的东西,这些东西很可能存在于任何现实世界的回购中. (6认同)
  • 另一个有用的标签是`--graph`,它可以直观地显示提交所在的分支. (4认同)
  • 将``git log``输出复制到changelog是没有意义的.您需要进行过滤和编辑工作以获得可读的更改日志,否则,为什么您甚至需要更改日志?我认为你可以自动生成更改日志,但请不要做``git log``的原始副本! (4认同)
  • `git log`是可读的,这里的人们已经表明了这一点.而且它不是原始的,`--oneline`和`--decorate`是选项.将它用于具有发行版的软件非常有意义,人们下载不包含.git目录的tarball,因此`git log`不可用.请客观批评. (2认同)
  • 只是为了补充一下这个对话,作为OP,我想我应该声明我正在寻找一个管理变更日志的_起点_。我可以浏览并编辑它以使其更易于阅读,但我可以轻松地看到所有更改。这种方法对我来说非常有用,因为我保留了相当好的提交消息,并且我显然可以更改或编辑掉我不想包含的内容。 (2认同)

Cas*_*bel 58

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

git log --pretty=%s                 # only print the subject
Run Code Online (Sandbox Code Playgroud)

如果你很好地命名你的分支,以便合并为master显示为"Merged branch feature-foobar"之类的东西,你可以通过仅显示该消息来缩短事物,而不是所有你合并的小提交,它们一起形成特征:

git log --pretty=%s --first-parent  # only follow first parent of merges
Run Code Online (Sandbox Code Playgroud)

您可以使用自己的脚本来扩充它,这可以执行诸如去除"合并分支"位,规范化格式等等.当然,您必须自己编写它.

然后,您可以为每个版本为changelog创建一个新部分:

git log [opts] vX.X.X..vX.X.Y | helper-script > changelogs/X.X.Y
Run Code Online (Sandbox Code Playgroud)

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

如果您的问题是那些提交主题并不像您想要放入更改日志中那样,那么您几乎有两个选择:手动完成所有操作(并尝试更频繁地跟上它而不是玩抓 - 在发布时间),或修复您的提交消息样式.一个选项,如果主题不打算为你做,将在你的提交消息的正文中放置诸如"更改:添加功能foobar"之类的行,以便稍后你可以做一些类似于git log --pretty=%B | grep ^change:只抓取那些超级 - 重要的消息位.

我不完全确定git可以真正帮助你创建更改日志.也许我误解了"管理"的意思?

  • 这绝对是一个很好的开始,我没有想过在身体上添加一个修饰符,以便我以后可以使用它.这可能就是我最终要做的事情.感谢您的反馈!如果在第二天左右没有更多答案,我会将你的答案标记为答案:-) (2认同)

vaa*_*aab 53

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

TL; DR:你可能想检查gitchangelog自己的更改日志或生成前一个的ascii输出.

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

  • 输出格式.(纯自定义ASCII,Debian更改日志类型,Markdow,ReST ...)
  • 一些提交过滤(您可能不希望看到更改日志中出现的所有错误或外观变化)
  • 一些提交文本争论在包含在更改日志之前.(确保将消息规范化为具有首字母大写或最后一个点,但也可以删除摘要中的一些特殊标记)
  • 你的git历史兼容吗?大多数工具并不总是如此容易地支持合并,标记.这取决于你如何管理你的历史.

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

考虑到这一切,我创建并使用gitchangelog.它旨在利用git commit消息约定来实现所有以前的目标.

必须具有提交消息约定才能创建一个不错的更改日志(使用或不使用gitchangelog).

提交消息约定

以下是有关在添加提交消息时考虑可能有用的建议.

您可能希望将提交大致分成大部分:

  • 按意图(例如:new,fix,change ...)
  • 按对象(例如:doc,packaging,code ...)
  • 受众(例如:开发人员,测试人员,用户......)

此外,您可能想要标记一些提交:

  • 作为"次要"提交,不应该超出您的更改日志(化妆品更改,评论中的小错字......)
  • 作为"重构",如果你真的没有任何有意义的功能变化.因此,这不应该也是最终用户显示的更改日志的一部分,但如果您有开发人员更改日志,则可能会有一些兴趣.
  • 您还可以使用"api"标记API更改或新的API内容...
  • ...等等...

尝试通过尽可能多地定位用户(功能)来编写提交消息.

这是标准,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 
Run Code Online (Sandbox Code Playgroud)

所以如果你注意到,我选择的格式是:

{new|chg|fix}: [{dev|pkg}:] COMMIT_MESSAGE [!{minor|refactor} ... ]
Run Code Online (Sandbox Code Playgroud)

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

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

如何从中生成精美的更改日志

然后,制作完整的更改日志非常容易.您可以快速制作自己的脚本,或者使用gitchangelog.

gitchangelog将生成一个完整的更改日志(带有分段支持New,Fix...),并且可以合理地配置为您自己的提交约定.它支持任何类型的输出感谢到通过模板化Mustache,Mako templating以及写有原蟒蛇默认的传统引擎; 所有当前的3个引擎都有如何使用它们的示例,并且可以输出更改日志,如gitchangelog的PyPI页面上显示的那样.

我相信你也知道还有很多其他git logchangelog工具.


Har*_*eta 26

更多的是CHANGELOG.告诉我你是否喜欢它.

git log --since=1/11/2011 --until=28/11/2011 --no-merges --format=%B
Run Code Online (Sandbox Code Playgroud)


小智 23

gitlog-to-changelog脚本可以生成GNU风格ChangeLog.

如图所示gitlog-to-changelog --help,您可以ChangeLog使用以下选项选择用于生成文件的提交--since:

gitlog-to-changelog --since=2008-01-01 > ChangeLog
Run Code Online (Sandbox Code Playgroud)

或者之后传递其他参数--,这些参数将传递给git-log(由内部调用gitlog-to-changelog):

gitlog-to-changelog -- -n 5 foo > last-5-commits-to-branch-foo
Run Code Online (Sandbox Code Playgroud)

例如,我在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
Run Code Online (Sandbox Code Playgroud)

此规则在发布时用于ChangeLog使用最新的尚未记录的提交消息进行更新.该文件.last-cl-gen包含记录在其中的最新提交的SHA1标识符,ChangeLog并存储在Git存储库中. ChangeLog也会记录在存储库中,以便可以在不更改提交消息的情况下对其进行编辑(例如,更正拼写错误).


bit*_*voc 20

由于为每个版本创建标记是最佳做法,因此您可能希望对每个版本的更改日志进行分区.在这种情况下,此命令可以帮助您:

git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B
Run Code Online (Sandbox Code Playgroud)


sky*_*der 14

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

它从标签已关闭的问题和合并的拉取请求生成更改日志.

CHANGELOG.md由此脚本生成.

例:

更新日志

1.2.5(2015-01-15)

完整的更新日志

实施增强功能:

  • 使用里程碑来指定修复了哪个版本的错误#22

修正了错误:

  • 尝试为没有标签#32的 repo生成日志时出错

合并拉取请求:


Tom*_*rre 10

我也为此建了一个图书馆.它完全可以使用Mustache模板进行配置.这样可以:

我还做了:

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

在此输入图像描述