拆分大型git存储库 我们有一个大型的C++存储库,大小为80 GB,拥有200000个文件,包含多个组件。p>

拆分大型git存储库 我们有一个大型的C++存储库,大小为80 GB,拥有200000个文件,包含多个组件。p>,git,split,Git,Split,库(归档)对于更多具有紧密耦合的组件是通用的 在这种情况下,所有git操作和编译/构建特定组件花费的时间太长 请告诉我如何将单个回购分为多个回购。首先,200000个源文件可能占用不到80GB的空间(除非每个文件代表400KB的源文件!) 2015年更新:git lts实际上可以管理此类卷。 见“” 原始答复(2013年) 这意味着: 任何生成的二进制文件都需要从git repo中排除 任何大的二进制文件都需要存储在其他地方(可以存储在a中,也可以存储在任何其他存储空间中,如) 第二,只有

库(归档)对于更多具有紧密耦合的组件是通用的

在这种情况下,所有git操作和编译/构建特定组件花费的时间太长

请告诉我如何将单个回购分为多个回购。

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

2015年更新:git lts实际上可以管理此类卷。
见“”


原始答复(2013年)

这意味着:

  • 任何生成的二进制文件都需要从git repo中排除
  • 任何大的二进制文件都需要存储在其他地方(可以存储在a中,也可以存储在任何其他存储空间中,如)
第二,只有在我们谈论一次大规模回购时,git的运作才会缓慢。
git是用来管理多个小型回购协议的(即使是最大的回购协议也远不及您提到的文件大小和数量)

因此,您需要:

  • 要拆分巨额git回购,请执行以下操作:

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


报告补充说:

我听说了一些关于GIT子模块的事情,这将有助于划分或拆分大型代码库。
我不熟悉这一点,有人能帮我理解以下关于这一点的几个问题吗

1) git子模块是如何工作的?它会将庞大的代码分成多个回购协议吗?有了这个,我们可以解决GIT缓慢的问题吗

子模块是在另一个回购(成为“父”回购)中声明的git回购

  • 有关子模块的一般说明,请参见
  • 关于在子模块中可以执行的操作,请参见我的
父回购协议对子模块回购协议有固定的已知参考,即:
克隆父回购时,默认情况下不会克隆其中声明的所有子模块

在您的例子中,这可能很有趣,因为您不需要克隆所有源代码来进行您提到的那种增量编译。
另外,多笔回购意味着更小的回购,像
签出
日志
差异
状态
这样的命令进行得更快

2) 假设我们使用此子模块将主回购分为多个回购。。。这能否解决我们面临的问题(回购协议之间的依赖性)

示例:假设我们将主要核心回购分为
Super
RepoA
RepoB
RepoC
等 那么,是否有可能将所有这些回购合并在一起?
RepoA
能否从其他repo(
Super
RepoB
RepoC
等)访问库,反之亦然

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

  • 结帐仅用于指定步骤所需的回购
  • 将编译后的库存储在这些repo之外,以便
    repoB
    repoC
    使用

目标是从仅源代码的依赖项切换到(生成的)二进制依赖项,其中可以基于
repoA
编译步骤生成的二进制文件编译
repoB

您可以使用以下命令在Github中为文件夹创建存储库

git filter-branch --prune-empty --subdirectory-filter foldername master
这假设您已经确定了要提取的组件,并且在创建存储库后对构建过程进行了排序

参考:


对于西方人来说,10万=10万。这真的是80 GB的源代码,还是您正在提交构建对象或其他二进制资源?可能是重复的我编辑了我的答案以提及git-lts。感谢您的快速回复。。。是的,我们有200000个源文件(包括.cpp、.h、.lib_def、.exe_def、.tst_def、.sdl、.oml等)。正如您所提到的,我们试图通过使用以下步骤来拆分组件1)预编译当前repo中的所有库2)移动与功能组件相关的代码,并在编译/构建这些功能组件期间使用预编译库3)从这些组件生成预编译库,以便在公共代码中使用。4)但是我们遇到了一些问题。。。因为我们的代码库是紧密耦合的或具有双向依赖关系(例如,主repo库用于拆分的repo,而来自这些拆分的repo的库用于主repo)。由于这一点,在我们的回归测试阶段,当公共代码发生变化时,首先我们需要在公共代码中构建预编译库,通过使用这些变化的库,我们正在编译拆分的组件库,然后通过使用这些库,我们正在重新编译整个公共代码组件,以获得一个为测试而构建。5) 这需要非常多的协调,并且需要遵循一些顺序步骤,比如首先编译公共gimp代码,然后通过确定依赖关系和顺序来编译拆分的组件。6) 由于