拆分大型git存储库

时间:2013-06-07 14:47:40

标签: git split

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

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

有了这些所有的git操作和编译/构建,一个特定的组件花费的时间太长了。

请建议我如何将这个单一的回购分成多个回购。

2 个答案:

答案 0 :(得分:4)

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

2015年更新: git-lts 实际上可以管理这种音量 请参阅“Efficient storage of binary files in a git repository”。


原始答案(2013)

这意味着:

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

其次,如果我们谈论一个巨大的回购,git操作只会很慢 完成git来管理多个 small repos(即使git Linux kernel repo远不及你提到的文件的大小和数量)

所以你需要:

  • 分开巨大的git repo:

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


OP user2463892添加in the comments

  

我听说过一些关于GIT子模块的事情,它将有助于划分或拆分大型代码库   我对此并不熟悉,任何人都能帮助我理解我的一些问题,如下所示吗?

     

1)git子模块的工作原理是什么?它会将巨大的代码分成多个回购吗?有了这个我们可以解决GIT缓慢的问题吗?

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

父级仓库对子模块仓库的固定已知引用为special entry,表示:
当您克隆父回购时,默认情况下不会克隆在其中声明的所有子模块

在您的情况下,这可能很有趣,因为您不需要克隆所有源代码,以便进行您提到的增量编译。
此外,多个回购意味着较小的回购,其中checkoutlogdiffstatus等命令的速度更快。

  

2)假设我们通过使用这个子模块将主回购分成多个回购...这会解决我们面临的问题(回购之间的依赖)吗?

     

示例:假设我们将主要核心仓库分为SuperRepoARepoBRepoC等...   那么可以将所有这些回购汇编在一起吗?   可以RepoA从其他回购(SuperRepoBRepoC等)访问该库,反之亦然?

相互依赖仍然存在,但你可以:

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

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

答案 1 :(得分:1)

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

git filter-branch --prune-empty --subdirectory-filter foldername master

这假设您已经确定要提取哪些组件,并在创建存储库后整理构建过程。

参考: