如何自定义 git rebase --interactive 提交消息的格式?

Posted

技术标签:

【中文标题】如何自定义 git rebase --interactive 提交消息的格式?【英文标题】:How do I customize the format of git rebase --interactive commit messages? 【发布时间】:2010-03-19 22:18:43 【问题描述】:

我在本地工作中使用 git(并且非常喜欢它),并且我遵循类似于 this article 中描述的工作流程。所以基本上,当开始一个新特性时,我为它创建一个分支,经历通常的 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++。)

谢谢!

【问题讨论】:

您应该考虑更改接受的答案,因为 git 现在已经添加了对此的支持 @Joakim 如下所述,git 2.6 的特性与 OP 不完全匹配,所以 Jefromi 的回答成立。 【参考方案1】:

从 Git 2.6+(2015 年第三季度)开始,实际上会有一种配置 git rebase -i commit message 的方法。

参见Michael Rappazzo (rappazzo) 的commit 16cf51c(2015 年 6 月 13 日)。(由 Junio C Hamano -- gitster -- 合并于 commit 9f56db7,2015 年 8 月 3 日)

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

配置选项“rebase.instructionFormat”可以覆盖变基指令列表的默认“oneline”格式。

由于列表是使用左、右或边界标记加上 sha1 来解析的,因此它们被附加到指令格式中。

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

rebase.instructionFormat

git log 中指定的格式字符串,用于交互式变基期间的指令列表。 该格式将自动将长提交哈希添加到格式中。

例如:

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

请注意,该功能发布后存在错误/回归: 见“Comment in rebase instruction has become too rigid”

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


Jefromicmetsbelow:

它似乎它只是为了影响交互式 rebase 中的显示,而不是生成的提交消息

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

所以这对 OP 来说并不完美。

【讨论】:

有人告诉我我的答案现在是错误的,所以我看了一下 - 它似乎只是为了影响交互式 rebase 中的显示,而不是生成的提交消息。我用你的示例格式字符串试了一下,我确实在我的编辑器中看到了作者信息,但是一旦我告诉它压缩,生成的模板提交消息仍然是通常的。 @Jefromi 好点。我已将您的评论包含在答案中以提高知名度。我在问题中添加了一条评论,说明你的答案仍然是那个。 ~~这是一个很棒的功能,除了我不知道如何格式化日期。我坚持使用非常冗长的默认设置。有没有办法覆盖git log 的日期设置来解决这个问题?~~ nvm 我发现--format 的日期类似于%ai%aD @CervEd 所有选项都列在git-scm.com/docs/git-log#Documentation/git-log.txt-emadem:%ad%aD%ai%ah,...:尝试其中一个,看看哪个适合。 @VonC 是的,对不起,我想通了【参考方案2】:

我认为没有办法(除非破解源代码)来修改壁球消息模板。但是,您有几个选择:

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

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

另外,在这种情况下,这可能不是您想要的,但在最近的 git 版本中,您可以使用 fixup 标识符来代替 squash - 它做同样的事情,但它会丢弃提交消息,因此,如果您有一个带有真实消息的提交,然后有十个修复,您只需将它们标记为所有修复,而不必删除它们的一次性消息。

【讨论】:

我同意。 +1。有关修复(和自动压缩)的更多信息,请参阅***.com/questions/2302736/trimming-git-checkins/… 酷!我将不得不更新 msysgit 并进行此修复和这样的尝试。 :) 我已经开始使用 Vim 进行文本编辑恶作剧,所以我想我会选择 2 号门! 这个答案现在不正确,因为对这个的支持被添加到了 git。 @Joakim 这会改变交互式 rebase 中显示的指令格式。但它是否也会改变生成的提交消息? (我试过了,好像没有——我看到的是修改后的说明,但是原来的壁球组合信息。)【参考方案3】:

您可以在需要时进行 --amend。您可以在提交之前签出您想要更改并修改它的提交。

【讨论】:

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

以上是关于如何自定义 git rebase --interactive 提交消息的格式?的主要内容,如果未能解决你的问题,请参考以下文章

git rebase

git rebase 中断后如何修复

Git (master|REBASE 1/1) 是啥意思?我该如何摆脱它?

Git在rebase时如何保留merge commit(实用!)

如何退出GIT的rebase状态,强制覆盖本地代码

git rebase 成功之后如何撤销