2017-06-16 25 views
3

我有一個包含多個Git子模塊的大項目。主項目使用不同庫的集合,一些庫使用庫本身。所有庫都可以獨立使用,所以它們都需要一個包含測試基礎設施(VUnit和UVVM)的子模塊。如何減少同一來源的多個子模塊的內存佔用?

Git的子模塊的樹是這個樣子:

ProjectA 
o- libA 
    o- UVVM 
    o- VUnit 
o- libB 
    o- UVVM 
    o- VUnit 
o- libC 
    o- libA 
     o- UVVM 
     o- VUnit 
    o- UVVM 
    o- VUnit 
o- libD 
    o- UVVM 
    o- VUnit 
o- UVVM 
o- VUnit 

我有Git的內部數據庫和鏈接結構有一定的瞭解。因此子模塊的BLOB存儲在名爲modules的目錄中的主存儲庫的.git目錄中。它們通常具有與子模塊目錄名稱相同的符號名稱。

子模塊指向其數據庫主目錄,其中包含相對路徑的.git文件。作爲回報,子模塊數據庫的配置文件指向子模塊的工作樹。

因此,所有UVVM子模塊都可能指向同一個數據庫,但數據庫如何指向多個工作樹?

我發現Git擴展可以與多個工作目錄一起工作,但它是否也適用於我的情況下的子模塊?

我也打開其他建議。


編輯1:

這是.git目錄生成的內部結構。它爲每個UVVM和VUnit的子模塊重複創建全部對象存儲。

.git/ 
    modules/ 
    libA/ 
     modules/ 
     UVVM/ 
     VUnit/ 
    libB/ 
     modules/ 
     UVVM/ 
     VUnit/ 
    libC/ 
     modules/ 
     libA/ 
      modules/ 
      UVVM/ 
      VUnit/ 
     UVVM/ 
     VUnit/ 
    libD/ 
     modules/ 
     UVVM/ 
     VUnit/ 
    UVVM/ 
    VUnit/ 

服務器上的內存佔用量非常低,因爲所有子模塊都指向同一個存儲庫。但是客戶端的內存佔用非常高。

+0

在文件系統級別使用硬鏈接或重複數據刪除就足夠了嗎? –

+0

我不確定Git如何執行文件操作。例如。與SVN它刪除並創建操作,而不是就地內容替換。這樣的操作破壞了硬鏈接。我還在尋找一種可以爲新用戶使用'git clone'的解決方案。我們正在一羣8名開發人員中工作,其中一些在Linux上的Windows上。 (順便說一句,Windows支持硬鏈接在NTFS :)) – Paebbels

+0

我認爲這將有助於明確指出你正在尋找一個解決方案,幫助用戶的存儲庫,我認爲你只是在尋找一個服務器解決方案(裸倉庫在適當的文件系統上將是適當的)。據我所知,git使用很少更改的大塊文件。但是,您仍然對檢出的文件有重複。經常重新創建硬鏈接可能是必要的,也許這不是要走的路。 –

回答

0

如果採取.git/modules/libA/modules/UVVM作爲唯一一個源存儲庫:

  1. 刪除項目A/lib中/UVVM(工作樹)
  2. 刪除項目A/git的/模塊/ lib中 /模塊/ UVVM(源庫)
  3. CD項目A/lib中/UVVM
  4. 創建LibB分支在項目A/lib中/UVVM子模塊(儲存庫)
    • 它是項目A/lib中/UVVM。
  5. 運行git worktree add ../../libB/UVVM LibB

現在,工作樹LibA/UVVMLibB/UVVM共享相同的源代碼庫.git/modules/libA/modules/UVVM

重複做與其他UVVM相同的事情,和VUnit類似的事情。

+0

該解決方案如何在多臺計算機上工作?它如何將創建的設置複製到其他工作站/其他開發人員,例如在'git clone'操作上? – Paebbels

+0

每個克隆庫都需要這個過程。 –