我有一个包含多个 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(工作树)
- 删除 ProjectA/.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
执行类似的操作。
关于git - 如何减少同一源的多个子模块的内存占用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44585425/