2010-03-22 101 views
1

我們在多個地理位置分開的網站上工作。git:擁有2個推/拉回購同步(或1推/拉和1拉同步)

今天我有我們的git克隆全部在一個站點上運行A.然後來自站點B的用戶必須通過ssh來執行git克隆或推入更改。這些都是通過推送更新的裸回購。

理想情況下,對於git clone/push性能,我想限制必須通過ssh。

我想在站點A和站點B上有一個git repo X live的副本,並在它們之間有一些同步機制。或者讓X在這兩個站點上都能正常工作,但只允許推送給A(並且在克隆時間在B上正確安裝)

我很擔心A站點上的某個人推動對站點回購站點的更改A在同一時間B站點上的某個人推動了一個真正相互衝突的變化,在站點B的回購。

是否有一些「同步」解決方案內置於git中,用於像這樣的分佈式開放倉庫?

或者從X中獲取克隆的方式是將源/父從其他站點的X設置爲X?

感謝,

-John

回答

0

我知道這是不是回答你問的主要問題,但它會是方式,方法更容易,如果你沒有對付整合兩個可能衝突的中央儲存庫 - 當然,你可以想出一個設置來自動同步它們,但是在某個時候,衝突必須由人類解決。

如果來自B站點的用戶可以ssh進入站點A,他們應該能夠直接從站點A的回購站點推/拉 - 通過ssh進行push/pull是在git中使用遠程控制的主要方式之一。看看man page - 你會在列表中找到ssh的URL。

因此,在站點B,你只需要添加一個遠程:

git remote add siteA ssh://[email protected]/path/to/repo.git 

如果你真的有壞的帶寬限制和需要推動/非常頻繁拉,我想這確實可能是一個性能問題?我自己從來沒有遇到任何麻煩。

你理論上可以給出兩個中央回購後更新掛鉤,它立即推送到另一箇中央回購。這可以很好地工作,直到同時發生雙向推進(也許這不太可能?) - 那麼你需要一個真正的合併,需要一個非裸倉庫,並可能需要一個人工集成商來處理衝突。但只要沒有同時推動,回購總是在同一個地方,你不必擔心衝突。如果B得到更新,A也會得到更新,並且用戶試圖將衝突推入到A中的用戶將被迫自己解決它。

0

有幾種方法可以做到這一點。這聽起來像你主要想要一個更接近的地方讓人們從遠程站點B拉。

因爲git回購並沒有對現有文件(主要是裁判/頭文件)使用rsync工程非常適合製作備份/複製副本。通過這種方式,你可以有一個B站點的回購站點,用戶可以從站點B取回/取出。

這並不完全解決你所擔心的兩個站點推到同一分支的問題(這個問題是非破壞性的;在最壞的情況下,有人將不得不創建一個合併提交併推送到兩個補丁來協調補丁集)。

要解決您的問題,您可以使站點A成爲主要的回購站點,並將站點B設爲只讀從站。您可以在.git/config中指定一個選項,該選項在git-fetch手冊頁中描述:pushInsteadOf。說你的網址是「ssh:// siteB」和「ssh:// siteA」。支持這種配置將是這樣的:

 
[url "ssh://siteB"] 
    pushInsteadOf = ssh://siteA