Git 如何减少同一源的多个子模块的内存占用?

Git 如何减少同一源的多个子模块的内存占用?,git,git-submodules,memory-footprint,Git,Git Submodules,Memory Footprint,我有一个包含多个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- UVV

我有一个包含多个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存储在主存储库的
.git
目录中,该目录名为
modules
。它们通常与子模块目录名具有相同的符号名

子模块使用包含相对路径的
.git
文件指向其数据库主目录。作为返回,子模块数据库的配置文件指向子模块的工作树

所以所有的UVVM子模块都可能指向同一个数据库,但是一个数据库怎么可能指向多个工作树呢

我发现Git扩展可以与多个工作dir一起工作,但是它是否也可以与我的例子中的子模块一起工作

我也愿意接受其他建议


编辑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/

服务器上的内存占用非常少,因为所有子模块都指向同一个存储库。但是客户端的内存占用非常高。

如果将
.git/modules/libA/modules/UVVM
作为唯一的源存储库:

  • 删除项目a/libB/UVVM(工作树)
  • 删除ProjectA/.git/modules/libB/modules/UVVM(源存储库)
  • cd项目A/libA/UVVM
  • 在ProjectA/liba/UVVM子模块(存储库)中创建一个LibB分支
    • 这是为ProjectA/libB/UVVM准备的
  • 运行
    git工作树添加.././libB/UVVM libB
  • 现在,工作树
    LibA/UVVM
    LibB/UVVM
    共享相同的源代码库
    .git/modules/LibA/modules/UVVM


    重复对其余的
    UVVM
    执行相同的操作,类似于
    VUnit

    在文件系统级别使用硬链接或重复数据消除是否足够?我不确定Git如何执行文件操作。例如,使用SVN,它确实删除并创建操作,而不是就地内容替换。这样的操作会破坏硬链接。我还在为新用户寻找一种与git clone一起使用的解决方案。我们在一个由8名开发人员组成的团队中工作,有些在Windows上,有些在Linux上。(顺便说一句,Windows确实支持NTFS中的硬链接:))我认为明确说明您正在寻找一个帮助存储库用户的解决方案会有所帮助,我假设您只是在寻找一个服务器解决方案(在适当的文件系统上的裸存储库是合适的)。据我所知,git使用很少更改的大blob文件。但是,对于签出的文件,您仍然有副本。经常重新创建硬链接可能是必要的,也许这不是办法。我正在用户端寻找解决方案。服务器端没有重复,因为“重复”的代码在子模块中。这个解决方案如何在多台计算机上工作?它如何将创建的设置复制到其他工作站/其他开发人员,例如在
    git clone
    操作上?每个克隆存储库都需要再次执行此过程。