簡體   English   中英

Git子模塊是否必須在子目錄中?

[英]Do Git Sub-modules have to be in a Sub-directory?

我正在使用包含子模塊的子模塊的存儲庫中的項目進行工作。 我注意到某些子模塊依賴於其他子模塊已經包含的子模塊,我想清理存儲庫中的一些。

對我來說,最明顯的解決方案是將實際的子模塊存儲庫移至git目錄的根目錄(因此,其目錄與Project A的目錄位於同一位置),並在每個目錄內使用符號鏈接(或其他方式)這樣就不會在主存儲庫內重復代碼。

這可能嗎?

要“繪制”它,我有(其中箭頭指向子模塊依賴項)

~/A
  |->~/A/B
  |->~/A/C
         |->~/A/C/B

我想對其進行修改,以便:

~/A--|
     |___
~/B<-|<-|-|
~/C<----| |
  |_______|

這樣,每次存儲庫依賴B時,我都不會重復B的代碼(我的許多項目都依賴它)。

是的,他們有。 也就是說,要使Git存儲庫R 具有子模塊S的超級項目,子模塊必須在超級項目的工作樹中顯示為某些路徑path/to/submodule path/to/部分可以為空,但submodule部分不能為空。

原因是:

  • 超級項目R 具有某些子模塊 S的事實記錄在R的 .gitmodules文件中,然后記錄在R.git/config文件中。 特別是, Rgit submodule init應當使用的URL在某些.gitmodules文件中(出現在多個提交中)。 該子模塊的路徑是一些非空路徑P ,並且P和URL都被復制到.git/config

    將這些文件放入.git/config文件后,即可在.git/config文件中進行更改。 Git將使用這些值代替.gitmodules文件中的值。 最好將正確的路徑和URL提交到.gitmodules因為將來的 git clone R很可能會使用分支提示的.gitmodules文件來填充該未來克隆的.git/config文件。 (取決於誰運行git clone來確保它們正確填充文件。使用所選的提示提交的.gitmodules文件是填充它的默認方法。)

  • 但是,更重要的是,子模塊始終都應使用一個特定的提交 也就是說,超級項目將運行cd path/to/submodulecd P ),然后發出命令: git checkout hash 這會將S放在給定哈希值的分離HEAD上。 當您運行git submodule update時,將完成此操作。 1R中的每個提交中,一個特定的提交記錄為gitlink 該gitlink作為路徑P的條目存在於索引中(從中進行新的提交)。 索引只能保存確實存在或至少可以存在於存儲庫R的工作樹中的文件的路徑。

因此,為了讓R控制S ,Git將堅持要求S駐留在R的子目錄中。

如果您不需要R來控制S-如果您只是想自己自己git clone幾個存儲庫,並且在R中沒有提交,則存放gitlink條目來保存從S取得的哈希ID(無需S的知識或同意),那么您可以完全放棄使用子模塊的想法,並獲得所需的布局。


1您可以通過各種標志以及其他操作和選項來更改傳遞給此git checkout的參數,但是通常情況是這種分離的HEAD, 即使您.gitmodules文件和/或your中指定了 S 的分支名稱 .git/config

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM