2015-12-08 43 views
7

我查找了一段時間,沒有找到答案(也許我不知道該看什麼)。單個子模塊的多次回購

我們有一個主庫,它是一個由它自己存儲的庫(我們稱之爲Lib)它包含了我們大部分的模塊和子模塊。 讓我們也說,它的大小爲2GB ...

現在,我們已經得到了很多項目,如:ProjA,ProjB,ProjC每一個使用庫的子模塊。

ProjA

  • 庫(分支:大師,提交#:1)

ProjB

  • 庫(分支:其它,提交#:2)

ProjA

  • 庫(分公司:主,犯#:4)

因此,雖然我能夠保持每一個項目引用到正確的庫(又名子模塊)的版本。我現在有3 * 2GB = 6GB的相同子模塊。

有沒有辦法引用單個子模塊,同時保持正確的文件/版本引用?

例如,

ProjA

  • LIB/base_lib.h(V1.0)

  • LIB/file_only_in_this_commit

ProjB

  • LIB/base_l ib.h(V1.0)

ProjC

  • 庫/ base_lib.h(V1.1)

謝謝!

+0

不是我所知道的。每個存儲庫只能引用子模塊中的一個SHA,因此您添加了3次。我猜你有這樣的設置,因爲ProjA,ProjB和ProjC都是相互關聯和相互作用的。否則,這可能是3個不同的存儲庫。或者您可以在一個存儲庫中擁有3個分支,在這種情況下,每個分支上只能有一個子模塊的一個版本,從而可以擁有不同的子模塊參考 – houtanb

+0

如果您的目標是節省空間,一個硬鏈接克隆 – basin

+0

@basin有沒有辦法在git中定義這樣的硬鏈接?手動執行您的建議並不能真正解決問題,如果可能,我寧願避免使用腳本。 – Danra

回答

3

那麼,內部整個子模塊的東西是非常簡單的,所以你可以掌握它到你的口味。

裏面你的每一個Proj<N>/.git/modules/有對應Lib子模塊與來自Lib.urlProj<N> /.gitmodules指定的遠程引用克隆的裸庫的文件夾。這些裸存儲庫是優化的要點。

只要有可能,您可以簡單地使用硬鏈接重新創建它們。

1)的文件夾中在同一文件系統爲您的所有凸出回購創建Lib的裸露克隆:

git clone --bare url://to/Lib /path/to/Lib.git 

2)更換默認的子模塊回購與回購,引用由對裸露的回購協議。 1:

mv ProjA/.git/modules/Lib ProjA/.git/modules/Lib.old // preserve it for a while 
git clone --bare --local url://to/Lib \ 
    --reference /path/to/Lib.git ProjA/.git/modules/Lib 

3)還原從保存在回購的ProjA/.git/modules/Lib配置:

cp ProjA/.git/modules/Lib.old/config ProjA/.git/modules/Lib/config 

現在您可以檢查一切工作是否在ProjA並刪除ProjA/.git/modules/Lib.old等等。在這種情況下,所有回購將使用相同的文件對象。

在git中,子模塊的特定狀態由精確的SHA1引用。除非您在主要回購庫(例如git filter-branch或其他可能導致刪除提交的操作)中執行一些「惡意」操作,否則Lib中的所有適當提交將永久保存。您的Proj<N>完全獨立檢查特定提交,因此您不應該打擾ProjA中的Lib的狀態可能會干擾ProjB中的另一個Lib狀態。

6

您可以使用git worktree(因爲git的2.5版)爲庫子模塊創建附加worktrees,在裏面ProjA,ProjB的位置等

因爲git worktree使得它的痛苦做出幾個worktrees具有相同名稱(都稱爲「Lib」),我只是創建了一個腳本share_submodules來解決困難,並創建附加工作樹而不是子模塊,將其設置爲正確的子模塊提交,並遞歸執行子模塊中的所有子模塊共享模塊。

如果子模塊是由git submodule update --init --recursive創建的,除非所有副本都引用一個模塊的對象,否則它應該可以正常工作。

如果您通過刪除子模塊轉換到您的子模塊,您的.git中會出現雜散子模塊文件,我創建了find_stray_submodules.py進行清理。

+0

可能他/她在這種情況下需要完全停止使用'git submodule's ,他們不是嗎? – user3159253

+0

@ user3159253:這個**應該與'git submodule'兼容。儘管我只能在使用這個解決方案一段時間後(我剛開始)高度自信地說, – yairchu