2011-04-05 78 views
2

我有2個裸存儲庫。它們是由這樣的:在2個git儲存庫之間同步

ssh [email protected] 
git init --bare repo1 
ssh [email protected] 
git clone --bare [email protected]:repo1 

一種是用於開發(姑且稱之爲主要)和一個用於備份(如果第一次不能訪問)。是否有可能自動同步它們 - 就像在備份上執行git pull一樣。

我想你不能合併或拉上裸倉庫。有另一種方式擁有備份庫是最新的,而不是這樣的:當然

ssh [email protected] 
rm repo1 -fr 
git clone -- bare [email protected]:repo1 

時主要是沒一會兒訪問,我用備份的話,我會想更新主。

同時爲工作存儲庫添加2個遠程是一種解決方案,但是您必須不斷推送到它們兩個,如果無法訪問,則不會發生這種情況。

所有的衝突都在非裸庫

編輯解決爲什麼需要備份庫:

我們使用遠程存儲庫來交換代碼,它Daily的需要。通常人們不需要其他開發人員編寫的代碼,但情況並非總是如此。我們失去了與小學的接觸3天,這是不容易發展。我在另一臺服務器上創建了第二個存儲庫,並且我克隆了本地存儲庫,但是我必須爲很多項目執行此操作,而且這非常耗時。我更喜歡第二個存儲庫自動更新。

+1

只是一個簡短的建議(不是一個完整的解決方案):您可以在「主」上使用post-commit鉤子來將更改推送到「備份」,而不是從那裏拉它。但是,我沒有看到「備份」存儲庫的原因,因爲那是最初使用分佈式vcs的原因:每個克隆都是備份。 – KingCrunch 2011-04-05 13:58:16

回答

3

您可以使用git push --mirror other-remote將一個存儲庫中的所有ref映射到另一個存儲庫。這將不會反映倉庫配置或藏匿處,但 - 你可能也想看看這個問題的答案:


更新:在回答你的澄清問題並在下面發表評論,我應該說在git push --mirror這兩個方向上都不安全,因爲git push --mirror做了forced update of refs and removes deleted refs。例如,假設您的masterprimary是超前的,關於backup並有上primary一個新的分支尚未鏡像還沒有 - 那麼git push --mirror將在primary重置master分支到老態,並且刪除新創建的分支。

另外,即使你只從primary鏡像backup,這不是安全,讓人們推到backup,因爲任何新的東西完全推到那裏會被下一個鏡被刪除。

那麼,你可以做什麼?我假設當主存儲庫不可用時,整個機器不可用。因此,在備份服務器上,我將創建一個裸倉庫,正如您所建議的,主倉庫上的cron作業將鏡像存儲庫。但是,您不應允許用戶推送到該鏡像存儲庫,但是 - 當主服務器關閉時,請克隆鏡像以創建一個裸露的存儲庫,以便人們可以同時推送到該存儲庫。當主服務器備份時,阻止人們推送到備份上的新存儲庫,然後合併來自本地的更改並將新工作推回到主服務器。

+0

我試過了。由於備份有一些新的提交,我有'! [遠程拒絕] origin/HEAD(不一致的別名更新)'消息。我試着從備份中'git push --mirror primary',它成功了。之後,一切工作正常。我的問題是,如果有可能沒有更新,那麼'git push --mirror'是完全安全的。 – NickSoft 2011-04-06 08:15:55

+0

@NickSoft:我已經更新了我的答案來解決這個問題。 – 2011-04-06 09:23:06

+0

這很糟糕。我想要半自動同步,但我想如果您在同一分支上推送兩種回購不同的東西是不可能的。在接受答案之前,我會等待一些其他答案,然後我會做一些測試。 – NickSoft 2011-04-07 08:44:51

0

使用crontab腳本或類似命令定期對備份運行git push --mirror remote。你也可以添加一個提交鉤子來自動強制推送到另一個遠程更新,這樣你就沒有「失敗窗口」。無需從備份進行更新,因爲它可能從未擁有任何新的或更新的內容。