拆分大型 git 存储库

use*_*892 5 git split

我们有一个大型 C++ 存储库,大小为 80 GB,包含近 200,000 个文件,包含多个组件。

库(档案)对于更多数量的紧密耦合的组件来说是常见的。

这样,所有 git 操作以及编译/构建特定组件都会花费太长时间。

请建议我如何将这个单个存储库划分为多个存储库。

Von*_*onC 4

首先,200000 个文件可能占用不到 80GB 的空间(除非每个文件代表 400KB 的源文件!)

2015 年更新:git-lts实际上可以管理这种卷。
请参阅“ git 存储库中二进制文件的高效存储”。


原始答案(2013)

这意味着:

  • 任何生成的二进制文件都需要从 git 存储库中排除
  • 任何大型二进制文件都需要存储在其他地方(或者在类似 Nexus 的 工件存储库中,或者在任何其他存储空间中,例如git-annex

其次,如果我们谈论的是一个巨大的存储库,git 操作只会很慢。
git 是用来管理多个小型存储库的(即使是git Linux 内核存储库也远不及您提到的文件大小和数量)

所以你需要:

  • 将庞大的 git 存储库拆分为:

    • 功能组件(组件是一组连贯的文件,代表程序的主要功能:GUI、调度程序、启动器、实现程序主要功能块的任何内容)
    • 技术组件(所有这些常见的技术库,被多个其他组件重用,提供最终用户不可见的功能,仅由开发人员使用)
  • 通过使用二进制依赖项来加快编译过程,特别是在进行单元或小型集成测试时:您可以设置每个项目,以便它们使用在中生成的其他项目的二进制文件/exe,而不是获取所有源代码并重新编译所有内容命令编译和运行特定项目。
    这取决于您的库与其他组件的紧密耦合程度。


OP user2463892在评论中添加:

我听说过一些关于 GIT 子模块的事情,这将有助于划分或拆分大型代码库。
我对此不熟悉,有人可以帮助我理解以下与此有关的一些问题吗?

1)git子模块如何工作?它会将庞大的代码分成多个存储库吗?这样能解决GIT慢的问题吗?

子模块是在另一个存储库(成为“父”存储库)中声明的 git 存储库。

父存储库具有对子模块存储库的固定已知引用作为特殊条目,这意味着:
当您克隆父存储库时,默认情况下不会克隆其中声明的所有子模块

这对于您的情况可能很有趣,因为您不需要克隆所有源来进行您提到的那种增量编译。
另外,多个存储库意味着更小的存储库,使用诸如checkoutlogdiff等命令,status运行速度更快。

2)假设我们使用这个子模块将主存储库划分为多个存储库...这会解决我们面临的问题(存储库之间的依赖关系)吗?

示例:假设我们将主要核心存储库分为、 、SuperRepoA...那么 可以将所有这些存储库一起编译吗? 可以从其他存储库(、等)访问该库,反之亦然?RepoBRepoC

RepoASuperRepoBRepoC

相互依赖关系仍然存在,但您可以:

  • 仅结帐给定步骤所需的存储库
  • 将已编译的库存储在这些存储库之外,以便供repoBrepoC使用。

目标是从仅源依赖项切换到(生成的)二进制依赖项,repoB可以根据repoA编译步骤生成的二进制文件进行编译。