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