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

Eri*_*ner 5 git

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

更新:

我修改了一点用于内联使用.

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

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

Joe*_*ite 6

git-filter-branch可以做你想做的.具体来说,您需要--msg-filter参数:

这是用于重写提交消息的过滤器.参数在shell中使用标准输入上的原始提交消息进行评估; 其标准输出用作新的提交消息.

一个问题是git-filter-branch希望在分支中的每个提交上运行,而您只想重写一个提交(然后有效地重新设置其余提交).因此,您的消息过滤器需要具有一些条件逻辑,以输出新的提交注释(对于您实际上想要重写的一个提交),或者原始的,未修改的提交消息(对于其他所有内容).

这样做的诀窍:

git filter-branch --msg-filter "ruby /path/to/filter.rb 843c2da5e07de914ea2319fa3295730ff8b3b0a1 'New message'" HEAD
Run Code Online (Sandbox Code Playgroud)

git-filter-branch在调用脚本之前更改当前目录,因此您需要完全符合条件/path/to/filter.rb.

这是filter.rb:

if ENV['GIT_COMMIT'] == ARGV[0]
  puts ARGV[1]
else
  puts STDIN.read
end
Run Code Online (Sandbox Code Playgroud)

这可能可以在shell脚本中更简洁地重写,甚至可能甚至没有将消息过滤器脚本放在单独的文件中; 但是我在Windows上运行,所以我没有任何想象力.我有Ruby,所以我使用它,它确实有效.