缓慢的Git操作

缓慢的Git操作,git,Git,我已经在Git下建立了一个测试存储库。大多数文件都非常小,但数量非常多,而且像add和status这样的简单Git操作需要几十分钟才能完成。我可以选择哪些方法来控制这些内容的修订并获得合理的性能?我应该尝试使用子模块还是避开DVCSE?我想知道这里的“非常大”数字是什么。通常git觉得麻烦的不是小文件的数量,而是大的二进制文件。但是,我可以想象,如果数量足够大,您会希望将它们拆分为多个存储库-通过子模块或其他方式。如果它们需要驻留在一个repo中,您可能会发现例如Subversion更具性能 编

我已经在Git下建立了一个测试存储库。大多数文件都非常小,但数量非常多,而且像add和status这样的简单Git操作需要几十分钟才能完成。我可以选择哪些方法来控制这些内容的修订并获得合理的性能?我应该尝试使用子模块还是避开DVCSE?

我想知道这里的“非常大”数字是什么。通常git觉得麻烦的不是小文件的数量,而是大的二进制文件。但是,我可以想象,如果数量足够大,您会希望将它们拆分为多个存储库-通过子模块或其他方式。如果它们需要驻留在一个repo中,您可能会发现例如Subversion更具性能

编辑:好的,您添加了使用NFS装载的注释,这听起来可能是这里的瓶颈。请在中查看解决方案。尤其是core.preloadindex可能会引起这里的兴趣

发件人:

core.index

为git diff等操作启用并行索引预加载

这可以加快像git diff和git status这样的操作 在像NFS这样的文件系统上,缓存语义较弱,因此 相对较高的IO延迟。将此设置为true后,git将执行以下操作 与文件系统数据并行的索引比较,允许 重叠IO的


编辑2:评论中提到了600万个文件。我可以理解这将成为一个瓶颈-这确实是一个非常大的数量。

Git操作,如
add
status
需要
stat
对文件系统中的每个文件进行加密(以检测更改)。要么你有大量的文件(比如说,几十个或几十万个文件),要么你有一个运行速度相当慢的文件系统
stat


在任何情况下,如果您需要在速度非常慢的系统上工作,可以在索引中使用“假定未更改”位,这告诉Git不要麻烦
stat
ing文件。如果确实启用了此选项,则需要手动指示git拾取单个文件中的更改,例如,通过将它们直接传递到
git add
,否则git甚至不知道任何更改。您可以通过设置
git config core.ignoreStat true
,然后运行类似于
git reset--hard HEAD

的操作来启用此功能。众所周知,git能够快速处理大型项目。您使用的是速度较慢的文件系统吗?装载是通过NFS进行的,尽管头部非常高端。根据NFS信息更新了我的答案。我认为这是这里的关键信息。如果可能的话,我会考虑使用本地克隆,但是如果没有,那么请查看线程和配置选项。在本地SSD文件系统上,我也经历了非常慢的<代码> Git Reale//Cuff>操作。回购协议相当大——Cocoapods本地规范。我怀疑SVN比git性能更好——即使是这样,git也比git好得多(根据Linus Torvalds的说法,不使用git:p时你又丑又笨)。好吧,你不必相信我的话——即使Linus认为在某些用例中情况就是这样。Git作为一个整体在回购协议上运行,因此在某些情况下它不是最好的选择。二进制文件很少。文件的数量远远大于任何一个开源项目中的文件数量。我们目前的工作是大约50k个文件,这并不是一个问题。然而,如果你有几十万甚至几百万的东西,我可以看到这会成为一个瓶颈。我很想知道svn或perforce如何处理这些数据。。。如果你确实测试了它们,并且你在某处有数据,请让我们也知道:)大约有600万个文件。git状态操作需要大约2小时才能完成,core.preloadindex设置为true.Bingo!我没有把它们计算在内,因为我害怕,但如果我发现它有几十万甚至数百万个文件,几乎都是人类生成的,我也不会感到惊讶。我试着设置那个标志,它在一些操作上有点帮助,但还是太慢了。也许我应该创建大量的小型存储库。