2011-11-13 299 views
1

我將很快開發許多iPhone/iPad應用程序,並正在使用Git作爲我的版本控制系統。在過去的項目(但不是基於iOS)我已經使用SVN。我轉向Git的主要決定是分散結構。Git遠程服務器存儲庫文件存儲

我將使用遠程服務器作爲中央Git存儲庫(很可能是Atlassian的bitbucket)。我還沒有設置這個,但同時我一直在本地測試Git。

我已經閱讀了一些初學者資源,現在已經掌握了一些基礎知識,但有一點我需要確認我理解正確。

在我的例子中,我在我的Mac上使用本地版本的Git。

我創建了一個名爲git_test的本地git存儲庫。在這個倉庫中,我有兩個虛擬文件,稱爲file1file2。我明白,這是我的工作目錄,其中包含我的實際文件(而不是斑點)。

我也明白,遠程服務器上的中央存儲庫應該是裸露的,並且不包含工作目錄的實際文件。

我們假設我有兩個用戶(用戶A和用戶B)擁有相同的本地存儲庫。

用戶A

  • :修改file1的
  • 提交file1的
  • 執行一個推到遠程存儲庫

用戶B

  • :修改文件2
  • 提交文件2
  • 執行推到遠程存儲庫

我是在說,新的斑點被上傳到git的糾正/對象遠程存儲庫中的目錄?

然後,當用戶A和用戶B在他們的本地系統上執行pull命令時,實際文件而不是blob被更新爲新blob的內容。它是否正確?

對不起,這個冗長的問題。我只是希望一切都有道理。

回答

0

您不必太擔心裸倉庫中的斑點。最好理解的是,每個存儲庫都由提交對象時包含確切的文件結構的提交對象組成。

在你的例子中,用戶A在本地生成一個commitA,用戶B在本地生成commitB,他們都是在裸倉庫的master上創建的,它會指向一個提交對象(比如說)commitBase。這意味着它們都有一個commitBase的父類。

當A推時,他將他的commitA推送到裸倉庫,它將主分支指針移動到commitA。所有關於file1的信息都在提交對象commitA中(以及關於文件結構其餘部分的信息)。

在B推之前,他必須首先將commitA的更改提交到他的回購庫中,因爲遠程主分支指針不再指向commitBase。直到他與提交對象和分支指針上的遠程同步後才能推送。因此,當他將commitA對象放入其回購庫時,他將獲得fileA作爲其中的一部分,如果他執行了pull或rebase,它將出現在他的文件系統中,但只會將commit對象存入他的存儲庫(而不是文件他的工作目錄),如果他做了抓取。取指令只是在內部用新的提交對象更新git而不改變你自己的主分支指針。在合併/重新定義的時候,git將不得不對工作目錄中的文件做出一些決定,例如,如果通用文件可以輕鬆合併,或者新文件可以放在磁盤上,或者如果文件太大沖突,你將不得不手動解決文件中的衝突。

在你的簡單例子中,你沒有衝突,所以你要麼rebase並讓你的commitA成爲commitA2並且有一個commitB的父類,或者合併你的commitA對象的父類作爲commitBase,但是生成一個新的commitM對象是合併B和A的結果。

git在它的.git/objects目錄中如何內部表示這3個存儲庫中的任何目錄都是不相關的。它可能會壓縮和移動東西,以儘可能最大化其所有對象的數據庫,但它並不是我曾經爲了解提交對象到文件如何工作而擔心的事情。

+0

非常非常感謝。很好的解釋。 – mdim

0

當你推到遠程回購它將如果回答您的問題否認這一點,如果你的本地回購的背後是遠程回購

不知道

這可以確保你不要試圖改變文件已經改變 - 它迫使你事先拉最新的變化

當你拉到你的本地回購是實際的文件變化 - 在git回購我相信它創建一個新的差異文件iirc,但我可以錯誤,我所知道的是它並不實際覆蓋遠程文件

+0

非常感謝,這澄清了我的困惑。 – mdim

+0

如果@DanZimm已回答您的問題,請您考慮將答覆標記爲正確答案? –