我有一个包含多个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/
服务器上的内存占用量非常低,因为所有子模块都指向同一个存储库。但是客户端的内存占用非常高。
在文件系统级别使用硬链接或重复数据删除就足够了吗? –
我不确定Git如何执行文件操作。例如。与SVN它删除并创建操作,而不是就地内容替换。这样的操作破坏了硬链接。我还在寻找一种可以为新用户使用'git clone'的解决方案。我们正在一群8名开发人员中工作,其中一些在Linux上的Windows上。 (顺便说一句,Windows支持硬链接在NTFS :)) – Paebbels
我认为这将有助于明确指出你正在寻找一个解决方案,帮助用户的存储库,我认为你只是在寻找一个服务器解决方案(裸仓库在适当的文件系统上将是适当的)。据我所知,git使用很少更改的大块文件。但是,您仍然对检出的文件有重复。经常重新创建硬链接可能是必要的,也许这不是要走的路。 –