缓慢的Git操作

时间:2012-03-12 15:25:26

标签: git

我有一个我放在Git下的测试库。大多数文件都非常小,但是它们数量非常多,只需要几十分钟即可完成Git操作,例如添加和状态。我有什么选择将这些置于修订控制之下并获得合理的性能?我应该尝试使用子模块还是应该避开DVCS?

2 个答案:

答案 0 :(得分:13)

addstatus这样的Git操作需要stat文件系统中的每个文件(以检测更改)。您要么拥有真正大量的文件(例如,数十或数十万个文件),要么您的文件系统运行速度相当慢stat

在任何情况下,如果你需要在一个非常慢的系统上工作,你可以使用索引中的“假设未更改”位,这会告诉Git不要打扰stat文件。如果你打开它,你需要手动指示git获取单个文件中的更改,例如将它们直接传递给git add,否则Git甚至不会知道任何改变。您可以通过设置git config core.ignoreStat true然后运行类似git reset --hard HEAD的内容来启用此功能。

答案 1 :(得分:7)

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

编辑:好的,所以你添加了注释,你使用NFS挂载,这听起来像这里可能的瓶颈。请在this thread中查看解决方案。特别是core.preloadindex可能会引起人们的兴趣。

来自the documentation

  

<强> core.preloadindex

     

为git diff

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

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

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