2009-04-15 105 views
44

我想要在(Windows)網絡共享中存儲裸倉庫。我使用linux,並且使用CIFS安裝上述網絡共享。我的coleague使用windows xp,並將網絡共享作爲網絡驅動器自動掛載(從ActiveDirectory以某種方式)。網絡共享文件夾中GIT倉庫的併發性

我不知道是否可以使用兩臺計算機回購,沒有併發問題。

我已經測試過,並在我結束我可以克隆不錯,但我怕如果我們都訪問相同的回購(推/拉)可能發生的事情,在同一時間。

在git FAQ中有關於使用網絡文件系統(以及SMBFS的一些問題)的參考,但我不確定是否有網絡/服務器/ windows/linux完成任何文件鎖定 - 我是相當確定沒有。

那麼,有沒有人使用網絡共享一個git回購,沒有服務器,沒有問題呢?

謝謝
亞歷

PS:我想避免使用HTTP服務器(或git的守護進程),因爲我沒有訪問與共享服務器。另外,我知道我們可以從一個推到另一個,但我們需要在代碼/回購上進行備份。

更新:

我的擔心是不是網絡故障的可能性。即便如此,我們也會在當地設立必要的分支機構,我們將能夠編輯我們的資源。

但是,我們平時經常犯的,需要變基/合併頻繁。從我的觀點來看,最好的選擇是在股票上有一箇中央回購(所以備份是有保證的),我們都會從這個回購克隆,然後用它來重組。

但是,由於我們經常這樣做,我害怕文件/ repo損壞,如果它發生在我們同時推/拉。通常,每次我們訪問遠程回購時,我們都可以互相呼叫,但是最好是由計算機/網絡保護它。

而且,有可能GIT有一個內部機制來做到這一點(因爲有人可以把你的回購協議之一,而你在它的工作),但我沒有發現任何確鑿的呢。

更新2:

共享驅動器上的回購將是一個回購,不包含工作副本。

+3

謝謝你的問題亞歷克斯,我面臨類似的情況,這是非常有益的。需要補充的一點是:你需要確保你們兩個使用的是相同版本的git,因爲windows和linux的exe會在網絡共享上使用相同的裸回購,理論上可以在版本之間有一些區別。可能不是,但只是你需要銘記的一面旗幟。 – 2012-01-13 17:00:08

+0

另請參閱:http://stackoverflow.com/questions/1489542/are-there-any-concurrency-issues-in-backing-up-git – 2012-11-16 07:49:50

+0

將同步用戶數限制爲1可能很有用,方法是轉到文件夾的高級共享選項 – Omar 2013-02-14 19:29:31

回答

39

Git需要最少的文件鎖定,我認爲這是通過網絡文件系統使用這種共享資源時出現問題的主要原因。它可以避免的原因是,Git倉庫中的大部分文件---構成對象數據庫的所有文件都被命名爲內容的摘要,並且一旦創建就不可變。因此,有兩個客戶端試圖爲不同的內容使用同一個文件的問題沒有出現。

對象數據庫的其他部分更復雜 - refs存儲在「refs」目錄(或「packed-refs」)下的文件中,這些確實會改變:儘管refs/*文件很小並且總是可以重寫而不是被編輯。在這種情況下,Git會將新引用寫入臨時的「.lock」文件,然後將其重命名爲目標文件。如果文件系統符合O_EXCL語義,那是安全的。即使不是,可能發生的最糟糕的情況也是覆蓋ref文件。儘管遇到這種情況會很煩人,但它不應該導致腐敗:它可能是您推到共享回購的情況,並且推動看起來像是成功了,而實際上是其他人的做法。但是,這可以通過簡單地拉(合併其他人的提交)並再次推送來解決。

總之,我認爲回購腐敗在這裏不是太多問題 - 事實上由於鎖定問題可能會出現一些問題,但Git回購的設計可以最大限度地減少損失。

(免責聲明:這一切都在理論上聽起來不錯,但我沒有做回購的任何併發錘擊超過NFS不CIFS對其進行測試,並且只分享)

+0

謝謝!對於這樣的一些解釋我正在尋找。我會試一試,看看是否有什麼不好的事情發生,我會更新這個問題。 祝您有美好的一天! – Alex 2009-04-15 11:22:46

+0

你能提供一個URL或其他更深入的內容嗎?這真的很有趣 – knocte 2013-11-13 18:55:56

7

爲什麼要麻煩? Git旨在分發。只需在每臺計算機上都有一個存儲庫,並使用發佈和提取機制在它們之間傳播更改。

出於備份目的,運行夜間任務以將存儲庫複製到共享。

或者,創建共享上每一個存儲庫,並從他們做你的工作,但把它們作爲分佈式資料庫,從中可以相互拉動的變更。如果您使用這種方法,那麼執行構建等操作將會減少,因爲您將不斷地通過網絡訪問。

或者,在您自己的計算機上分配存儲庫,並運行定期任務以將您的提交推送到共享上的存儲庫。

+0

我認爲alexandrei提出的真正問題不是關於分佈式特性,但是如果由於CIFS/Windows共享失敗(掛載問題,斷開連接等)而推送失敗會發生什麼。 – 2009-04-15 09:07:57

+0

我明白了,我的要點是,爲什麼要擔心這個擔心?你不需要,如果你只是使用它的設計方式的git – 2009-04-15 09:17:27

+0

我認爲這裏的最後一點很優雅地回答了這個問題。只要讓每臺電腦的回購在不同的時間自動推入分享。 – supercheetah 2009-04-15 09:25:06

-2

聽起來就像您更願意使用集中式版本控制系統一樣,因此備份查詢是令人滿意的。 也許與xxx2git之間爲你在本地工作。

+0

這就是我們目前正在做的事,SVN介於兩者之間 - 但它是同樣的問題,沒有服務器,我們正在使用它基於文件。這是切換到GIT的原因之一(並且它更好地匹配我們的工作,在同一工作拷貝中在不同分支之間切換) – Alex 2009-04-15 11:25:18

5

顯然使用中央混帳回購協議被支持。大多數規定的用途表示ssh或http訪問,這兩者都不能避免同時訪問回購。即使您使用的是完全分佈的使用方式,但如果有兩個以上的協作者在任何地方推送相同的回購,則會出現此問題。到目前爲止,沒有任何迴應回答這個問題。 git的設計是否允許它同時處理N個分支?

相關問題