4

我有一个包含多个 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/

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

4

1 回答 1

1

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

  1. 删除 ProjectA/lib B /UVVM(工作树)
  2. 删除 ProjectA/.git/modules/lib B /modules/UVVM (源存储库)
  3. cd ProjectA/lib A /UVVM
  4. 在 ProjectA/lib A /UVVM submodule(repository) 中创建一个LibB分支
    • 它适用于 ProjectA/lib B /UVVM。
  5. git worktree add ../../libB/UVVM LibB

现在,工作树LibA/UVVMLibB/UVVM共享同一个源代码库.git/modules/libA/modules/UVVM

对其余部分UVVM重复做同样的事情,对VUnit.

于 2017-06-21T03:18:13.060 回答