如何自定义 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 (master|REBASE 1/1) 是啥意思?我该如何摆脱它?