2011-11-10 53 views
4

我正在將我們產品的源代碼組織成一堆不同的Git存儲庫。 (而我是Git的新手)。其中一些將通過子模塊在同一臺服務器上使用其他存儲庫。如果Git子模塊移動到另一臺服務器該怎麼辦?

據我所知,在GIT中的子模塊是一個指針到特定的在另一存儲庫提交和被定義爲:遠程子模塊的

  • URL(例如GIT中://foo.com/git /lib.git)
  • 克隆子模塊的倉庫變成一個子目錄(如包括我們所引用

的問題是,一個URL是貝因/富)

  • 提交ID g作爲子模塊添加時的提交的一部分存儲在存儲庫中。如果URL更改會發生什麼?父存儲庫可能有數百次提交 - 所有提交的子模塊都引用舊的URL。

    例如,假設我在git:// PrivateCompanyServer/repositories/*中存儲了存儲庫Super和Sub。 Super通過它的gitmodules文件引用Sub:git://PrivateCompanyServer/repositories/Sub.git。有幾個開發人員向Super提交了數百個提交 - 幾乎每個Super提交的提交都有一個包含該URL的gitmodules的快照。幾個產品版本都被標記了,並且各種分支都在gitmodules中有URL。現在,假設PrivateCompanyServer崩潰,我們將代碼移動到另一臺服務器。或者我們重新組織PrivateCompanyServer上的目錄結構。管他呢。現在我們已經有超過數百次的提交引用舊URL中的Sub存儲庫,而這個存儲庫已經不存在了。顯然,gitmodules文件可以在開發分支的頭部糾正,我們可以在那裏移動。但是出於維護的原因,我們可能需要返回各種舊的提交,並且他們都會引用舊的不再有效的URL。如何處理?

    很明顯,這可以通過rebasing /「重寫歷史記錄」來解決,以便存儲庫中的所有gitmodules文件都有新的URL,但我認爲這不是一個選項,因爲Super中的每個提交都會得到一個新的提交ID。所有引用Super的東西,包括使用Super作爲子模塊和本地開發人員知識庫的「超級超級」項目都會破裂 - 正確嗎?

    那麼處理這個問題的最好方法是什麼? 如果您在私有公司服務器上存儲一系列存儲庫(其中一些通過子模塊引用其他存儲庫),那麼當服務器更改名稱時會做什麼 - 因此會使gitmodules文件中的舊URL無效?

    我能想到的唯一解決方法是從歷史上的每個提交方式製作「很多分支」,只是爲了容納正確的gitmodules。看起來這樣會造成很多混亂和麻煩。似乎必須有更好的方式 - 當然我錯過了一些東西?

  • 回答

    2

    只要你不跑git submodule sync,在.gitmodules值不會影響以後的第一次子模塊進行初始化給定結賬子模塊路徑(在此之後,對輔助模塊中的路徑保存在.git/config文件)。

    因此,您可以在結帳時只更改一次路徑(使用git submodule sync對提交的路徑進行更新),並且它將保持不變。

    +1

    通過搜索Google的git子模塊同步,我發現這個有用的問題增加了更多的信息:http:// stackoverflow。com/questions/913701/changing-remote-repository-for-a-git-submodule .....感謝您指引我走下正確的道路! –

    相關問題