2017-06-16 24 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

每个克隆库都需要这个过程。 –