拆分大型git存储库

问题描述 投票:4回答:2

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

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

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

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

git split
2个回答
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用于管理多个小型回购(甚至git Linux kernel repo远远不及你提到的文件的大小和数量)

所以你需要:

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

OP user2463892添加in the comments

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

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

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

父repo对子模块repo的固定已知引用为special entry,这意味着: 克隆父repo时,默认情况下不会克隆其中声明的所有子模块

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

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

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

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

  • 结账时只需要给定步骤所需的回购
  • 将编译的库存储在那些repos之外,以便使用repoBrepoC

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


1
投票

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

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

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

参考:

© www.soinside.com 2019 - 2024. All rights reserved.