把10000个小文本文件放到代码库中,它会让git变慢吗?

时间:2014-01-07 14:52:24

标签: git

在当前项目中,测试人员经常将各种小文本文件放入代码库中。他们中的大多数都有10KB的大小,而且每天的数量都在增加。目前,已有超过6000个文件,我认为在不久的将来它将是10000个。

我们觉得git越来越慢。我们在cygwin中运行git,这使得它更慢。

以下是现在某些操作的成本:

  1. git stash - >超过一分钟
  2. git pull --rebase - >每次提交将花费1分钟
  3. 我们每天都在基本的git操作上浪费大量时间。

    我们正在寻找原因,尝试解决它。所以我想知道这些小文本文件是否是原因。

    如果它们是最大的原因,我们可以通过删除它们来修复它吗?或者我们必须在git服务器中删除它们(如果可能),或者创建一个新的git repo?

2 个答案:

答案 0 :(得分:3)

没有理由将它们从版本控制中删除,甚至没有提及从历史记录中删除它们。

Git本身速度快,文件数量多于此数量级。减慢速度的组件是操作系统。在枚举磁盘上的文件时,Windows简直太糟糕了。不幸的是,Cygwin只会让事情变得更糟,因为要提供完整的Unix兼容性,它必须进行额外的系统调用,如果使用Windows api则不需要。

Git需要枚举文件并在每次运行状态时查找修改时间,这也包含在提交中。在某些shell完成的情况下也会这样做。

好消息是你可以告诉git不要在特定文件中查找更改。如果您不需要修改文件,您只需告诉git不要使用

检查其时间戳
git update-index --assume-unchanged path...

文件仍然存在,你甚至可以修改它们,就在你这样做的时候,你必须明确地调用它们,因为git不会注意到这一点。

您也可以使用

停止检查它们
git add

这将阻止git更新目录。同样,您仍然可以使用显式git update-index --skip-worktree path... 添加新文件或新文件,但它甚至不会检查存储库版本。如果文件已经签出,那么git会在那里留下过时的版本,所以请记住你在做什么。

有关详细信息,请参阅git-update-index(1)


应该注意的是,在任何条件下,Windows上的git明显比大多数Unices慢。在一个相当大的存储库,比如20 000个文件,计算机启动后的第一个状态通常需要一段时间,但是在Linux上,一旦文件元数据被缓存,状态几乎是瞬间的,而在Windows上它总是需要几秒钟。

这不仅仅是git。 Windows上的Subversion状态同样较慢,而且旧版本的元数据也分布在许多文件上甚至更多。

答案 1 :(得分:1)

它变慢的主要原因是因为Git需要为许多常见操作统计数千个签出文件。在类Unix系统上统计操作非常快,但在Windows上通常很慢(取决于使用的API,但最快的API在修改时间,时区和夏令时时移和can't be used with Git方面存在问题)和我认为cygwin的Git比msysGit慢。

使用git rm删除文件并保留历史记录可以显着改善这种情况。在过去的提交中拥有数万个文件对大多数Git操作没有任何影响。