提交reword而不进行交互式rebase?

时间:2012-01-08 22:48:02

标签: git

是否可以在不使用交互模式的情况下运行提交的自动重写(由哈希标识)?我的目标是重写一行,因为我需要从代码中调用。

更新:

我修改了一点内联使用。

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

虽然在纯粹的bash(没有ruby)中会很好,但是我在使STDIN工作时遇到麻烦(使用read)。

1 个答案:

答案 0 :(得分: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,所以我使用它,它确实有用。