2012-01-08 40 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