我有一个我放在Git下的测试库。大多数文件都非常小,但是它们数量非常多,只需要几十分钟即可完成Git操作,例如添加和状态。我有什么选择将这些置于修订控制之下并获得合理的性能?我应该尝试使用子模块还是应该避开DVCS?
答案 0 :(得分:13)
像add
和status
这样的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可能会引起人们的兴趣。<强> core.preloadindex 强>
为git diff
等操作启用并行索引预加载这可以加快像git diff和git status这样的操作 在像NFS这样具有弱缓存语义的文件系统上 相对较高的IO延迟。将此设置为true,git将执行此操作 允许,并行地与文件系统数据进行索引比较 IO重叠。
EDIT2:在评论中提到了600万个文件。我可以理解这成为一个瓶颈 - 这确实是非常大的数量。