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