【问题标题】:How do I customize the format of git rebase --interactive commit messages?如何自定义 git rebase --interactive 提交消息的格式?
【发布时间】: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 的回答成立。

标签: git msysgit


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

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

【讨论】:

  • 是的,我使用 --amend 相当多,因为我的手指很胖,显然。 :) 但我不需要 --amend 压缩的提交来编辑生成的提交消息;我只是在为每个提交分配pick/edit/squash 后弹出的文本编辑器中对其进行格式化。我澄清了我的问题以说明这一点。
猜你喜欢
  • 2012-06-05
  • 2019-11-17
  • 2019-02-18
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2015-10-30
  • 2010-12-25
  • 2011-01-18
相关资源
最近更新 更多