问题 如何自定义git rebase --interactive commit messages的格式?


我使用git进行本地工作(并且非常喜欢它),我遵循类似于中描述的工作流程 本文。所以基本上,当开始一个新功能时,我为它创建一个分支,经历通常的hack然后提交循环,当我认为我已经完成它时,我将它压缩到单个提交中 git rebase --interactive master,我总是把大量的提交消息编辑成类似文章中的例子,在这里转载:

[#3275] User Can Add A Comment To a Post

* Adding Comment model, migrations, spec
* Adding Comment controller, helper, spec
* Adding Comment relationship with Post
* Comment belongs to a User
* Comment form on Post show page

当然,这是在一堆删除后 # This is the xth commit message 线条和复制/粘贴 * 在每个提交消息的前面。

现在,我想知道, 有没有办法自定义git rebase -i如何输出压缩的提交消息 所以我不必做那些黑客行为?

(我使用msysgit,如果重要的话。我的编辑器是Notepad ++。)

谢谢!


4366
2018-03-19 22:18


起源

您应该考虑更改已接受的答案,因为git现在已经添加了对此的支持 - Joakim
@Joakim如下所述,git 2.6功能与OP完全不匹配,所以Jefromi的答案就是这样。 - VonC


答案:


我没有想到,修改壁球消息模板是没有办法(没有黑客攻击源)。但是,您有几个选择:

  • 使用git log命令获取候选名单,例如`git log --pretty =“*%s”commit-1..commit-2来获取你的子弹。在linux中,很可能在你的编辑器中执行此操作 - 不知道如何使用msysgit。

  • 让你的编辑为你做的工作!我不知道你的编辑是什么,所以我不能告诉你该做什么,但在vim中肯定是非常可能的。 (想法是:搜索 /# This is the .* commit message/,删除几行,保留一行,删除下一​​条评论)

而且,在这种情况下,它可能不是你想要的,但是在相当新版本的git中,有一个 fixup 您可以使用而不是压缩的标识符 - 它执行相同的操作,但它会丢弃提交消息,因此如果您有一个提交真实消息然后十个修复,您可以只标记它们所有修复而不必删除它们的一次性消息。


4
2018-03-19 22:31



我同意。 +1。有关fixup(和autosquashing)的更多信息,请参阅 stackoverflow.com/questions/2302736/trimming-git-checkins/... - VonC
凉!我将不得不更新msysgit并给出这个修复和这样的镜头。 :) - adamjford
我已经开始使用Vim进行文本编辑诡计,所以我想我要去#2门! - adamjford
这个答案现在是不正确的,因为对git的支持已添加到git中。 - Joakim
@Joakim改变交互式rebase中显示的指令格式。但它是否也会更改生成的提交消息? (我试过了,它似乎没有 - 我看到了修改后的说明,但原始的壁球组合信息。) - Cascabel


启动Git 2.6+(2015年第3季度),实际上有一种方法可以配置git rebase -i commit消息。

看到 提交16cf51c (2015年6月13日)by 迈克尔拉帕佐(rappazzo
(合并 Junio C Hamano - gitster  -  在 提交9f56db7,2015年8月3日) 

git-rebase--interactive.sh:为自定义指令格式添加配置选项

配置选项'rebase.instructionFormat'可以覆盖默认值'oneline'rebase指令列表的格式。

由于使用左,右或边界标记加上sha1来解析列表,因此它们被添加到指令格式之前。

你很快就会有一个新的配置:

rebase.instructionFormat

格式字符串,如中所指定 git log,用于交互式rebase期间的指令列表。
  格式将自动在格式之前添加长提交哈希。

例如:

git config --add rebase.instructionFormat "[%an @ %ar] %s"

请注意,该功能发布后存在错误/回归:
见“对rebase指令的评论变得过于僵化

我注意到rebase指令表中注释行的格式变得更加严格 - 它不再以空格或制表符开头。注释char(例如“#”)必须出现在第一列上。


Jefromi 注释 下面

它出现 它只是为了影响交互式rebase中的显示,而不是结果提交消息

我尝试了你的示例格式字符串,我确实在我的编辑器中看到了作者信息,但是一旦我告诉它压缩,结果模板提交消息仍然是常见的。

所以这不适合OP。


9
2017-08-16 19:20



有人告诉我,我的答案现在是错误的所以我看了一下 - 看起来它只是意味着影响交互式rebase中的显示,而不是结果提交消息。我尝试了你的示例格式字符串,我确实在我的编辑器中看到了作者信息,但是一旦我告诉它压缩,结果模板提交消息仍然是常见的。 - Cascabel
@Jefromi好点。我已将您的评论包含在答案中以获得更多可见性。我已经在问题中添加了评论,说明你的答案仍然是答案。 - VonC


你可以随时做一个--amend。你可以在提交之前签出,你想要改变并修改它。


0
2018-03-21 10:10



是的,我用了很多 - 因为我的手指很胖,显然。 :)但我不需要 - 我的压缩提交来编辑生成的提交消息;我只是在为每次提交分配pick / edit / squash之后弹出的文本编辑器中对其进行格式化。我澄清了我的问题以解释这一点。 - adamjford