2012-01-08 44 views
4

是否可以在不使用交互模式的情况下运行提交的自动reword(由散列标识)?我的目标是重新编写单行代码,因为我需要从代码中调用。提交reword而没有交互式转发?

UPDATE:

我修改了一些用于在线使用。

git filter-branch --msg-filter "ruby -e \"puts (ENV['GIT_COMMIT'] == '1ba2dd66581f6fbc03d1a6406a0ed61b6473c9ab' ? 'new msg' : STDIN.read)\"" HEAD

会很好,但在纯庆典(不红宝石),但我曾与获得STDIN(使用读)工作的烦恼。

+0

您可以重置为提交,进行修改以更改提交评论,然后从原始分支中挑选其后的每个提交。但似乎有一个比这更简单的方法。 – 2012-01-08 22:54:18

+0

它看起来像''git-filter-branch'](http://linux.die.net/man/1/git-filter-branch)可能是有用的,特别是'--msg-filter'选项。但是我很难弄清楚如何告诉它哪个提交重写。 – 2012-01-08 23:09:30

+0

如果你试图在纯bash中做到这一点,我不知道如何去做条件逻辑,但是对于'if'的情况你可以使用'echo',对于'else'的情况你可以使用'cat -'只需将STDIN复制到STDOUT即可。 – 2012-01-09 13:33:17

回答

5

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,所以我使用了它,它确实有效。

+0

太棒了!注意哈希码的语义在这里略有改变:'git'通常会抱怨哈希码不明确;你的代码似乎正在改变所有提交模糊散列码的提交。不是一个问题,只需要记住一点:安全性比抱歉要好。 – alf 2012-01-09 00:37:52

+0

@alf,我甚至没有考虑过两个具有相同的7个字符的十六进制前缀的提交 - 你绝对正确的说,在这种情况下会产生不希望的效果。为了安全起见,我将代码更改为需要完整散列。如果OP以编程方式调用此代码,那么完整的散列可能无论如何都是可用的。 – 2012-01-09 00:46:16