2011-11-09 39 views
1

我想寫一個基於git的工具,但做了一些相當不尋常的事情,我需要知道:是否安全地同時運行git merge --ff-only [remote-branch]的多個實例以獲取其中任何一個的最新提交?所有的遙控器將在同一行提交。我希望能夠讓我的工具產生所有的東西,讓git把它整理出來,但是我需要知道這是否會導致問題。有沒有人對git內部知道足夠的知識來說一種方式或另一種方式?可以同時運行'git merge'的多個調用嗎?

+0

你能詳細介紹一下用例嗎?不同的遙控器可以有相互衝突的變化嗎?難道你不能得到一個基準做'git fetch'並且使用'git log'來選擇最新的一個典型? – Romain

+0

我使用git在一堆機器上分發一些數據。由於只有一個新提交的最終來源,所以不會發生衝突。在這種情況下,「合併」實際上是一個誤用,因爲我想要做的就是查看遠程跟蹤分支是否更新,如果是,則更新主分支和工作副本。大多數合併將是空操作,但有時更新將會傳播,並且在極少數情況下,可能會有兩三個遠程控制檯,每個遠程控制檯或多或少地在同一時間具有相同的更新提交。 –

+0

然後,從所有遙控器中「git fetch」,然後將「git merge --rebase」轉換爲您剛纔提取的最前面的遙控器頭正在做你想做的。 – Romain

回答

1

如果你正在做--ff只合並,你爲什麼不只是檢查參考git branch --contains或其他方式來查看舊的提交是否可達,然後執行重置或update-ref?

這應該是非常快的,並且可能會避免更新工作目錄。

+0

謝謝,這實際上聽起來非常有用! –

1

Git使用鎖定來防止併發訪問,在最糟糕的情況下,您的合併嘗試將失敗,出現類似lock file exists錯誤。

順便說一句,合併允許多重合並,還有一種章魚合併策略。

+0

八達通合併很酷,但是OP提到了「--ff-only」,這在章魚的情況下永遠不會發生,對? – Romain

+0

@Romain是的,可能...但是如果所有的分支都會有相同的提交(即只是像對方的備份副本),它可以工作,但是我沒有嘗試過自己並且懷疑... – kan

+0

章魚合併確實創建了一個MERGE_HEAD,其中包含所有正在合併的提交的引用。 –

0

在這種情況下,爲什麼不按照合併每個遠程分支而不是同時產生它們呢?

#!/bin/sh 
set -e 
for rtb in origin/master github/master gitorious/master 
do 
    git merge --ff-only $rtb 
done 

如果HEAD已經包含了遠程跟蹤分支之一,合併仍成功返回,說Already up-to-date.

+0

我正在這樣做,但事實證明,如果IO不能很好地工作,'git merge'可以隨機抽取一分鐘以上,所以我希望能夠讓負責此操作的線程執行其他操作。我可能只是把所有的合併放在它自己的線程中,序列化並完成它。 –

+0

對。遍歷提交圖應該只涉及很少的IO,以確定是否需要合併。在大多數情況下,我懷疑大多數IO在發現需要進行快速合併之後才真正檢查新的提交,在這種情況下,您最大的收穫是找到最近的提交,並且只合並那個提交。 –

相關問題