我们有一个大型80 GB的大型c ++存储库,有近200,000个文件,包含多个组件。
库(档案)对于更多数量紧密耦合的组件是常见的。
有了这些所有的git操作和编译/构建,一个特定的组件花费的时间太长了。
请建议我如何将这个单一的回购分成多个回购。
答案 0 :(得分:4)
首先,200000 源文件可能占用不到80GB的空间(除非每个文件代表400KB的源!)
2015年更新: git-lts 实际上可以管理这种音量 请参阅“Efficient storage of binary files in a git repository”。
原始答案(2013)
这意味着:
其次,如果我们谈论一个巨大的回购,git操作只会很慢 完成git来管理多个 small repos(即使git Linux kernel repo远不及你提到的文件的大小和数量)
所以你需要:
分开巨大的git repo:
加速编译过程,特别是在进行单元或小型集成测试时,使用二进制依赖项:您可以按顺序设置每个项目,而不是获取所有源并重新编译所有内容让他们使用二进制文件/ exes生成其他项目,以便编译和运行特定项目 这取决于您的库与其他组件的紧密耦合程度。
OP user2463892添加in the comments:
我听说过一些关于GIT子模块的事情,它将有助于划分或拆分大型代码库 我对此并不熟悉,任何人都能帮助我理解我的一些问题,如下所示吗?
1)git子模块的工作原理是什么?它会将巨大的代码分成多个回购吗?有了这个我们可以解决GIT缓慢的问题吗?
子模块是在另一个仓库中声明的git仓库(它成为“父”仓库)。
父级仓库对子模块仓库的固定已知引用为special entry,表示:
当您克隆父回购时,默认情况下不会克隆在其中声明的所有子模块
在您的情况下,这可能很有趣,因为您不需要克隆所有源代码,以便进行您提到的增量编译。
此外,多个回购意味着较小的回购,其中checkout
,log
,diff
和status
等命令的速度更快。
2)假设我们通过使用这个子模块将主回购分成多个回购...这会解决我们面临的问题(回购之间的依赖)吗?
示例:假设我们将主要核心仓库分为
Super
,RepoA
,RepoB
,RepoC
等... 那么可以将所有这些回购汇编在一起吗? 可以RepoA
从其他回购(Super
,RepoB
,RepoC
等)访问该库,反之亦然?
相互依赖仍然存在,但你可以:
repoB
或repoC
使用。 目标是从仅源依赖项切换到(生成的)二进制依赖项,其中repoB
可以根据repoA
编译步骤生成的二进制文件进行编译。
答案 1 :(得分:1)
您可以使用以下命令在Github中为文件夹创建存储库。
git filter-branch --prune-empty --subdirectory-filter foldername master
这假设您已经确定要提取哪些组件,并在创建存储库后整理构建过程。
参考: