2017-06-12 104 views
0

我想在我的Gitlab服務器上添加一個鉤子以防止在主服務器上推送合併分支,前提是他們之前沒有重新分配。強制分支在重新合併之前合併並推入

例如: A---B---C---D ← master \ E---F---G ← new-feature

我希望用戶合併/推前衍合他的特點。 A---B---C---D-------------H ← master \ / E'---F'---G'

我不希望這種推 A---B---C---D---H ← master \ / E---F---G

這樣行,是一個良好的開端,但我沒有找到意味着只有拒絕不是空的合併提交: Force Feature Branch to be Rebased Before it is Merged or Pushed

回答

1

強制重新分配的通常原因是合併承諾的病態仇恨,因爲制定政策的人看不到他們的價值。目前還不清楚爲什麼你想採用rebase的缺點(很可能中間的commit不會被測試),但仍然會合並;這對我來說似乎是最有價值的合併提交可能。但如果你必須...

你意味着你想接受的合併將是「空」;這不完全正確。它將更改應用到其第一個父項(儘管不是它的第二個父項,因爲如果允許,它將是快進)。

我認爲你是真的說的是,如果第一個父代從第二個父代到達(通過父指針),你會接受合併。所以,你可以採取的

git rev-list --merges $oldrev..$newrev 

輸出並互相喂導致

git merge-base --is-ancestor commit-ID^ commit-ID^2 

提交ID爲提交-ID參數拒絕,如果merge-base命令永遠返回非零值。

(技術上我猜你可能還需要確保承諾並未有3周或以上的父母。)

仍然允許這樣的事情

 (origin/master) 
      | 
x -- x -- x -------------------- M <--(master) 
      \     /
      x -- x -------x -- x 
        \ /
        x -- x 

如果避開這是一個規則,這是非常困難的;你基本上會希望通過頭提交的第一個父指針可以達到每一個合併。 (但你不能只是說,合併應該可以訪問從頭部提交的第一父,因爲那時你還是會允許

 (origin/master) 
      | 
x -- x -- x -------------------- M -- x<--(master) 
      \     /
      x -- x -------x -- x 
        \ /
        x -- x 

這是一樣的。)所以你可以,也許,作爲一個「第一步」你開始尋找合併之前,做一個

git rev-list --first-parent $oldrev..$newrev 

,並掛到返回所有提交ID值的列表,從而你會發現每個合併可以確認它在該列表中。

如果這一切聽起來都沒有樂趣,我完全同意;這就是爲什麼我不會試圖從這個建議中組裝一個工作腳本的原因,爲什麼我建議你允許合併或不要試圖採取這樣不尋常的中間立場。

+0

謝謝您的詳細解答。 重新分配功能分支會在主設備上次更改時進行測試。 我接受快進合併,但有時保持分支的繪圖有時很有趣。 – Benito103e

+1

* rebase特性分支的*上次提交將被測試。中間提交,不太可能。除非您測試並修復現在重新設計的分支中的每個* before * commit,否則您最終可能會得到'x-x - O - x - O - x - x - x - O',其中'x'可能無法正確構建或運行,如果您想要使用「bisect」來追蹤缺陷,這特別麻煩。 –

+0

這是一個很好的示範,事實上是的,你需要測試,最終在rebase之後修復所有之前的提交。 – Benito103e

1

這是絕對有可能,但你需要編寫一些代碼。您還必須決定精確定義「良好」提交圖更新的內容。你舉的例子說,一個請求從這個去:

o--o--o--* <-- master 

這樣:

o--o--o--*---o <-- master 
    \  /
    o--o--o 

是被拒絕,而這樣的:

o--o--o--*---------o <-- master 
      \  /
      o--o--o 

將被接受。但是,這第三個替代方案呢:

o--o--o--*------o-----o <-- master 
      \ / /
      o--o--o--o 

這增加了兩個合併,而不是一個;但是沒有新的提交的合併具有的任何父代是先前值爲master的祖先。

而且,這個呢?

o--o--o <-- master 

(這裏推已去除這曾經是master尖端提交。)

如果第二個推動,這增加了兩個合併,但他們沒有達到回任何早期提交,是不是被接受,最後一次推送也是不被接受的,你的任務的一部分很容易:你最多允許一個合併,也許只限於兩個父母兩個父母 - 也許這甚至必須是「第一父母」 - 爲的先前價值(提交標記爲*)。只要建議的新master不是舊的master(沒有提交將被刪除)的祖先,你的其餘任務可能允許沒有合併。

如果第二個(兩合併)推動被接受,編碼將更加棘手。請注意,如果它不被接受,某人仍然可以推動這樣的合併,他們只需要分多步執行(每合併一次)。