我們項目中的一些貢獻者喜歡直接在master上工作,但仍忘記git pull --rebase
。如何避免「合併分支'主'ssh://gdcm.git.sourceforge.net/gitroot/gdcm/gdcm」
有沒有辦法拒絕服務器端提交像Merge branch 'master' of ... into master
提交?
我們項目中的一些貢獻者喜歡直接在master上工作,但仍忘記git pull --rebase
。如何避免「合併分支'主'ssh://gdcm.git.sourceforge.net/gitroot/gdcm/gdcm」
有沒有辦法拒絕服務器端提交像Merge branch 'master' of ... into master
提交?
作爲VonC評論,你可以用我爲這個問題寫的一個簡單版本的pre-receive
鉤子做到這一點。
要重新提示您所要求的內容,您需要在服務器上掛接一個pre-receive
掛鉤,該掛鉤將拒絕任何推送到具有任何非線性歷史記錄的主服務器,即引入具有多個父代的任何提交。該鉤子應該做你想要什麼:
#!/usr/bin/ruby -w
ref_to_check = "refs/heads/master"
STDIN.each_line do |line|
rev_old, rev_new, ref = line.split(" ")
if ref == ref_to_check
merges_introduced = `git rev-list --merges #{rev_old}..#{rev_new}`
unless merges_introduced.strip.empty?
STDERR.puts "Refusing push to #{ref}, since it would create non-linear"
STDERR.puts "history by introducing the following merge commits:"
STDERR.puts merges_introduced
exit(1)
end
end
end
更新:在Jefromi's answer到鏈接的問題,他表明,使用git rev-list --merges
是更整潔,所以我已經更新了這個腳本使用,並固定在環在推送試圖更新的每個參考資料上。
我有什麼特別的。這是我得到的:計數對象:13,完成。 增量壓縮使用多達4個線程。 壓縮對象:100%(7/7),完成。 寫入對象:100%(7/7),668字節,完成。 合計7(delta 6),重用0(delta 0) 錯誤:無法運行掛接/預接收:無此文件或目錄 要ssh://[email protected]/gitroot/gdcm/ gdcm ! [遠程拒絕]主 - >主(預接收鉤拒絕) 錯誤:無法將某些文件推送到'ssh://[email protected]/gitroot/gdcm/gdcm' – malat 2011-03-30 12:47:47
「shebang」行指向'/ usr/bin/ruby' - 你是否在該機器上安裝了ruby,並且是二進制文件所在的位置? – 2011-03-30 13:17:55
(當然,您可以輕鬆地在shell腳本或任何其他腳本語言中執行相同的操作。) – 2011-03-30 13:18:34
有點類似於這個,不是嗎? http://stackoverflow.com/questions/2039773/have-remote-git-repository-refuse-merge-commits-on-push – VonC 2011-03-30 07:24:15