git-filter-branch
可以做你想做的。具体而言,您需要--msg-filter
参数:
这是用于重写提交消息的过滤器。参数在shell中使用标准输入的原始提交消息进行评估;其标准输出被用作新的提交消息。
一个皱纹是git-filter-branch
希望在每提交的分支运行,而你只需要重写一个提交(进而有效变基的其余部分)。所以你的消息过滤器需要有一些条件逻辑,以输出新的提交注释(对于你实际上想要重写的一个提交)或原始的,未修改的提交消息(对于其他所有内容)。
该做的伎俩:
git filter-branch --msg-filter "ruby /path/to/filter.rb 843c2da5e07de914ea2319fa3295730ff8b3b0a1 'New message'" HEAD
git-filter-branch
改变当前目录将调用脚本之前,这样你就需要完全限定/path/to/filter.rb
。
这里的filter.rb
:
if ENV['GIT_COMMIT'] == ARGV[0]
puts ARGV[1]
else
puts STDIN.read
end
这也许可以在shell脚本更简洁地改写,也许甚至没有把消息过滤器脚本在一个单独的文件;但我在Windows上运行,所以我没有任何花哨的东西。我有Ruby,所以我使用了它,它确实有效。
您可以重置为提交,进行修改以更改提交评论,然后从原始分支中挑选其后的每个提交。但似乎有一个比这更简单的方法。 – 2012-01-08 22:54:18
它看起来像''git-filter-branch'](http://linux.die.net/man/1/git-filter-branch)可能是有用的,特别是'--msg-filter'选项。但是我很难弄清楚如何告诉它哪个提交重写。 – 2012-01-08 23:09:30
如果你试图在纯bash中做到这一点,我不知道如何去做条件逻辑,但是对于'if'的情况你可以使用'echo',对于'else'的情况你可以使用'cat -'只需将STDIN复制到STDOUT即可。 – 2012-01-09 13:33:17