如何在git中重命名最近的N个提交消息?

26

我有30个提交,我想在所有消息的开头添加“Bug XXXXXXX”,我可以用一次操作/命令完成吗?

我试图避免压缩它们。


你尝试过使用 git ammend 吗?不确定它是否允许你进行多个提交。 - Mark Mikofski
2个回答

46

使用git rebase -i HEAD~<N>,其中N是要回溯的提交数,-i将使其变得交互式,即它将在vim中打开或者在您的默认编辑器中打开。请参阅Scott Chacon's Book。然后您可以更改提交消息。

如果您需要自动化处理,则可能需要尝试filter-branch

另一个历史重写选项,如果您需要以某种可脚本化的方式重写大量提交,则可以使用该选项

在这种情况下,您将使用:

git filter-branch --msg-filter <command>

查看git-filter-branch手册

这是手册中提供的一个示例,用于在一系列提交记录中追加“Acked-by”。您可以将其更改为“BUG XXXXXXX”。

git filter-branch -f --msg-filter '
    echo "Bug XXXXXXX: \c"
    && cat
    ' HEAD~<N>..HEAD

N代表要回溯的提交次数,并追加“BUG XXXXXXX”。


3
我想避免在每次提交后停止,我想修改并更改消息... - talabes
这是 StackOverflow 最近关于 Git Filter Branch 的问题列表:http://stackoverflow.com/questions/tagged/git-filter-branch - Mark Mikofski
不错的解决方案!在将此答案设置为解决方案之前,我有一个问题:现在消息是:“Bug XXXX:\n<旧消息>”,我该如何将整个新消息放在一行中?谢谢! - talabes
尝试使用 echo -n "Bug XXXX: " && cat 来避免末尾的换行符。这样可以吗? - Mike Seplowitz
不是这样的...它打印出来的是:“-n Bug XXXX: \n <old message>”。很奇怪,因为只有Bug XXX被包含在引号中。 - talabes
2
"git filter-branch -f --msg-filter 'echo "Bug XXXXXXX: \c" && cat' HEAD~N..HEAD" 是最终答案 :) - talabes

2

最好不要依赖以下任何一种:

echo -n "Bug XXXXXXX: "

echo "Bug XXXXXXX: \c"

echo命令的行为取决于使用的版本。请参见下面链接的stackoverflow问题:

'echo'在shell脚本中不换行

更好的解决方案可能是:

git filter-branch -f --msg-filter '
    printf "%s" "Bug XXXXXXX: "
    && cat
    ' HEAD~<N>..HEAD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接