2011-03-30 75 views

回答

1

作爲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是更整潔,所以我已經更新了這個腳本使用,並固定在環在推送試圖更新的每個參考資料上。

+0

我有什麼特別的。這是我得到的:計數對象: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

+0

「shebang」行指向'/ usr/bin/ruby​​' - 你是否在該機器上安裝了ruby,並且是二進制文件所在的位置? – 2011-03-30 13:17:55

+0

(當然,您可以輕鬆地在shell腳本或任何其他腳本語言中執行相同的操作。) – 2011-03-30 13:18:34

相關問題