5

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

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

有了这个,所有的 git 操作和编译/构建一个特定的组件都需要很长时间。

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

4

2 回答 2

4

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

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


原始答案(2013)

这意味着:

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

其次,只有在我们谈论一个巨大的 repo 时,git 操作才会很慢。
git 用于管理多个小型仓库(即使是git Linux 内核仓库也远不及您提到的文件的大小和数量)

所以你需要:

  • 拆分巨大的 git repo:

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


OP user2463892在评论中添加:

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

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

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

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

这在您的情况下可能很有趣,因为您不需要克隆所有源代码来进行您提到的那种增量编译。
另外,多个 repos 意味着更小的repos,使用诸如checkout,和之类log的命令并且速度更快。diffstatus

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

示例:假设我们将主核心 repo 分为Super, RepoA, RepoB,RepoC等...
那么可以将所有这些 repo 一起编译吗?
可以RepoA从其他 repos ( , 等) 访问该库SuperRepoB反之亦然RepoC

相互依赖关系仍然存在,但您将能够:

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

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

于 2013-06-07T16:25:04.323 回答
1

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

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

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

参考:

于 2014-10-19T20:48:51.593 回答