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

标签 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- 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作为唯一一个源码仓库:

  1. 删除项目A/libB/UVVM(工作树)
  2. 删除 ProjectA/.git/modules/libB/modules/UVVM(源代码库)
  3. cd ProjectA/libA/UVVM
  4. 在 ProjectA/libA/UVVM 子模块(存储库)中创建一个 LibB 分支
    • 它适用于 ProjectA/libB/UVVM。
  5. 运行 git worktree add ../../libB/UVVM LibB

现在,工作树 LibA/UVVMLibB/UVVM 共享相同的源存储库 .git/modules/libA/modules/UVVM.

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

关于git - 如何减少同一源的多个子模块的内存占用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44585425/

相关文章:

android - 使用终端 IDE 从 Android 上的 GitHub 克隆

git - 如何永久删除 Github 标签?

optimization - GCC 与 ARM 上的 Greenhills

java - Java 的反射如何影响其内存占用?

java - Java Records实际上是通过类似的类声明来节省内存还是它们更像语法糖?

git - 将本地仓库链接到不正确的 github 帐户

Git 启动很慢

git - 添加 git 子模块时为 "You are on a branch yet to be born"

node.js - 使用 git 子模块导致发布时 npm 包大小太大

git 子模块 merge 冲突 : how to visualize?