我有一个包含多个 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 扩展适用于多个工作目录,但它也适用于像我的情况一样的子模块吗?
我也愿意接受其他建议。
编辑 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(工作树)
- 删除项目A/.git/modules/libB/modules/UVVM(源存储库)
- cd ProjectA/libA/UVVM
- 在 ProjectA/libA/UVVM 子模块(存储库)中创建LibB分支
- 它适用于ProjectA/libB/UVVM。
- 运行
git worktree add ../../libB/UVVM LibB
现在,工作树LibA/UVVM
和LibB/UVVM
共享同一个源存储库.git/modules/libA/modules/UVVM
。
对其余的UVVM
反复做同样的事情,对VUnit
做类似的事情。