2017-09-25 138 views
0

我需要一個「機器人用戶」通過一些腳本與git裸遠程存儲庫交互。這裸露的回購被稱爲中央回購。鏡像git非裸存儲庫

這次,這個機器人用戶有自己的本地存儲庫,這不是一個裸倉庫(他必須檢出分支,合併分支......)。但每天晚上,當他起牀工作時,他需要在本地有一個完美的中央回購鏡像(除了主人以外,每個分支都可以進化,可以創建一些新的分支......)。

這樣做的最好方法是什麼?

回答

1

不幸的是,這並不像前面的答案那樣直截了當,因爲git pull僅將更改合併到當前分支中。

你的機器人需要做的第一件事是git fetch - 雖然這是事實,一個git pull會(默認),導致這種情況發生,我建議做fetch直接以避免潛在的,令人困惑的副作用。

當您執行fetch時,您將獲得的配置取決於remote.central.fetch配置選項(對於名稱爲central的遠程,如您所示)。一個clone(假設你沒有指定像mirrorsingle-branchdepthno-single-branchclone命令)後的默認設置將取所有分支的歷史,並且將更新遠程分支裁判(如refs/origin/central/master指示在central上的master分支的條件)。

如果你堅持這一點,那麼你的本地裁判仍然不與遠程同步。這是否是一個問題取決於你的機器人在做什麼。這裏有很多排列......可能你的機器人在fetch之前有本地變化,如果有的話,你想要怎麼處理它們?您的機器人會在fetch之後進行更改,最終會推動這些更改嗎?再加上任何數量的「如果你希望歷史出來看起來像X,做Y」的考慮。

我會說,如果你的目的是把所有的地方分支機構,以反映central對應的分支,有兩種基本方法:

1)保持在默認設置的Refspec,然後遍歷分支更新本地裁判以匹配遠程。這使您有機會處理任何本地更改(通過將它們合併或重新分配到分支歷史記錄中),但需要大量的腳本。

2)將refspec改爲看起來像在鏡像克隆上。 (我明白這就是你所得到的,以及你是如何看待這個問題的。)這可能是有風險的,因爲本地更改可能會被破壞,而且你仍然必須識別在central上被刪除的任何分支。這裏的設置將類似於

git config remote.central.fetch +refs/*:refs/* 
0

這是非常簡單的(如果通過完美的鏡子你的意思是all branches, but not other refs)。

在沒有--bare的情況下克隆裸回購會導致正常的回購。做完這一次後,你的機器人只需要

git pull 

當他開始工作。