在大型代码库中创建Git分支非常缓慢。

4

我有一个本地代码仓库,其中包含约300,000个文件和大约40GB的加密文件系统(无法更改...)。

经常需要创建新的分支,并将工作目录的当前内容作为此分支的内容。

因此,这个“checkout”实际上并不是修改工作区中任何内容的检出,而只是创建一个分支,切换到该分支,并保持工作目录不变。这与大文件无关:平均文件大小远小于1MB(40GB/300,000=130KB)。

目前我的操作是:

git checkout -q -b mynewbranch
git add -v -A
git commit -q -m "at mynewbranch"

原则上这是可行的,但创建分支的第一步需要超过一个小时的时间!(“add”和“commit”只需要几分钟,我可以接受。)“git checkout”似乎需要重新读取整个工作目录才能创建分支。
理想情况下,我希望创建分支几乎不需要任何时间,并且它的状态应该仅基于先前存在的分支。然后,“add”也不应该花费太多时间,因为可以使用时间戳,而不是将所有文件内容与存储库进行比较,只有具有新时间戳的文件才需要详细查看。
有人有想法如何高效地实现吗?
编辑:git 2.17、Ubuntu、Encfs在Ext4上、最近的硬件、12个CPU、大多数二进制文件(如PDF、JPEG、MP4;没有深层次的树形结构;它们需要进行版本控制)。
主要问题是:是否可以避免仅创建分支时查看所有文件的内容?

3
你使用什么操作系统和文件系统?你的存储驱动器有哪些特点?文件的特征是什么?它是源代码(比如深层次树形结构中的小型文本文件)或其他类型的文件吗?除了 git 之外,你是否还有任何其他后台运行的软件可能会处理这些文件? - battlmonstr
参见:https://dev59.com/THA75IYBdhLWcg3waIMJ - battlmonstr
1
如果您在使用Windows操作系统,Microsoft公司已经发布了许多工具(他们使用了一个500GB的Windows工作目录),可以帮助您解决问题。其中包括确保您使用的是最新版本的Git。https://blogs.msdn.microsoft.com/devops/2018/01/11/microsofts-performance-contributions-to-git-in-2017/ - jessehouwing
1
如果您的存储库中有许多二进制文件,转换为LFS也可能会提高性能。 - jessehouwing
根据您的更新,启用Git-LFS确实应该会有很大帮助。正如您可能已经注意到的那样,Git并不适合处理大型二进制文件。 - jessehouwing
显示剩余2条评论
1个回答

2
Git并不适用于大型存储库(尽管微软最近已经扩展了它以支持它们 - 请参见上面的问题评论)。我建议您将存储库拆分为多个存储库,并/或使用LFS。如果您使用LFS,则可能需要使用BFG Repo Cleaner来高效地重新创建存储库,而无需在历史记录中包含所有大文件 - 除非存储库仅由大文件组成。
LFS支持版本控制

大文件版本控制

使用Git对大文件进行版本控制,即使是几GB大小的大文件。


分割文件很可能没有任何帮助。它仍然会重新读取所有文件的数量,只是分布在多个存储库中。 100个1分钟仍然是1.5小时。 我的观点是,为了复制一个分支而按顺序读取所有文件内容是完全无用的; 挑战在于,哪些git命令或设置可以使git不执行这种耗时的无聊操作。 - Marit Lendox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接