我有一个放在Git下的测试存储库。大多数文件都非常小,但它们的数量非常多,简单的Git操作,如add和status,需要几十分钟才能完成。我有什么选择来控制这些版本并获得合理的性能呢?我应该尝试使用子模块,还是应该避开DVCSes?
发布于 2012-03-13 02:53:41
像add和status这样的Git操作需要stat检查文件系统中的每个文件(以检测更改)。要么您有非常大量的文件(例如,数万或数十万个文件),要么您的文件系统的stat操作相当慢。
在任何情况下,如果你需要在一个运行速度极慢的系统上工作,你可以在索引中使用“假定不变”位,这会告诉Git不要麻烦stat文件。如果你真的打开了这个功能,你需要手动指示git获取单个文件中的更改,例如直接将它们传递给git add,否则Git甚至不会知道任何更改。您可以通过设置git config core.ignoreStat true,然后运行类似git reset --hard HEAD的命令来启用此功能。
发布于 2012-03-13 02:44:26
我想知道什么是“非常大”的数字。通常,git发现麻烦的不是小文件的数量,而是大的二进制文件。但是,我可以想象,如果数量足够大,您会希望将它们拆分到几个存储库中-或者通过子模块的方式,或者通过其他方式。如果它们需要驻留在单个代码库中,您可能会发现例如Subversion的性能更高。
编辑:好的,您添加了使用NFS挂载的注释,这听起来像是这里可能的瓶颈。请在this thread中查看该问题的解决方案。特别是这里可能会对core.preloadindex感兴趣。
来自the documentation
core.preloadindex
为git diff等操作启用并行索引预加载
这可以加快git diff和git status等操作的速度,尤其是在缓存语义较弱、因此IO延迟相对较高的NFS等文件系统上。设置为true时,git将并行地对文件系统数据执行索引比较,从而允许重叠IO。
EDIT2:在评论中提到了600万个文件。我可以理解这会成为一个瓶颈--这确实是一个非常大的数量。
https://stackoverflow.com/questions/9669882
复制相似问题