2013-10-17 18 views
1

Pro Git書中的頁面http://git-scm.com/book/en/Git-Tools-Submodules討論了創建子模塊作爲git項目中的目錄。這是用於添加輔助模塊中的命令:Git子模塊:令人困惑的聲明

$ git的子模塊添加的git://github.com/chneukirchen/rack.git架

在頁面之後,它說

您可以將機架目錄視爲單獨的項目,然後不時更新您的超級項目,並指向該子項目中的最新提交。

這是什麼意思?在這種情況下,我不知道「指針」或「更新」是什麼意思。這個指針在哪裏以及如何存儲?如何更新超級項目?

+0

它存儲在哪裏?在'.gitmodules'中,還可以在索引中找到(用於該子模塊回購的SHA1)作爲特殊條目:http://stackoverflow.com/a/2227598/6309。這是什麼意思?請參閱http://stackoverflow.com/q/1979167/6309。 – VonC

回答

3

子模塊是一個獨立的Git回購 - 使子模塊成爲「超級項目」引用的子模塊,或者說,子模塊回購所在的Git回購。

當您對正在被用作子模塊的repo進行更改時,您將按照通常的做法使用Git repo - 您將進行更改,添加它們,提交它們並將它們推送。但是,在子模塊回購中進行這些更改後,您會注意到在「超級項目」回購中將會有未提交的更改,並且這些更改將引用子模塊回購。

那麼改變了什麼?那麼,「超級項目」回購會保留子模塊回購標籤 - 它的位置,名稱和(這很重要)它當前的提交。爲什麼要提交?因爲它允許您在「超級項目」中指定在子模塊中引用的正確提交。這具有許多優點 - 使用第三方庫(作爲子模塊)的圖片,最近最近使用第三方庫進行了更新,這些更新包含尚未更新項目以適應的反向更改。通過保留對較舊提交的引用,可以確保開始處理項目的任何人都將使用正確支持的子模塊版本。

如果要更新「超級項目」以引用子模塊的最新提交,只需像添加,提交和推送其他任何更改的文件一樣進行即可。

1

Dev1 & Dev2具有以下源代碼結構。

  • SrcTree
    • MainCode
    • 子模塊

DEV2做一些修改,子模塊和推動變化。

  • 從子模塊
    • 「混帳添加子模塊的文件」
    • 「git的承諾」
    • 從SrcTree
      • 「混帳推」
    • 添加
    • 承諾
    • 推//這是要更新的子模塊的指針

DEV1需要做下面的動作來正確地更新子模塊

  • 混帳拉//這將改變指針,但不更新子模塊所提到here
  • 混帳子模塊更新//這將更新子模塊
+0

'git submodule update'會爲子模塊提取正確的提交,但它不會更新「超級項目」回購指向最新的提交,因爲OP問如何做。您的答案缺少Dev1更新了對「SrcTree」項目中子模塊的新提交的引用的步驟。 – redhotvengeance

+0

@redhotvengeance更新了答案。謝謝 – abnvp

+0

您的更新使事情更加清晰,但仍然遺漏了關鍵部分(涉及OP的問題)。具體而言,除了將更改推送到子模塊之外,Dev2還需要將更新的子模塊提交提交給SrcTree並推送。否則,當Dev1執行'git pull'時,子模塊「指針」將不會被更新,並且將不會有任何新的拉動,也不會在運行'git submodule update'時進行任何更新。 – redhotvengeance