Git状态需要较长时间才能完成

130

我正在使用 git 管理 Windows 机器上本地目录中的文件 - 没有涉及网络,也没有推送或从另一台计算机拉取。我的目录里大概有100个文件,全部都是测试文件,相当小。每当我运行 git status,它经常需要20-30秒才能完成。这正常吗?我能做些什么来加快它的速度,或者有更好的方法来查看我的代码库的状态(已更改的文件、未跟踪的文件等)吗?其他git命令似乎执行得更快。


你使用的是哪个git版本?请考虑在msysGit Google Group或git邮件列表(git [at] vger.kernel.org,您无需订阅)上寻求帮助,也许这是git中的一个bug。 - Jakub Narębski
可能是Ways to improve git status performance的重复问题。 - dCSeven
请查看 git status 中的 "未跟踪的文件和性能"。 - VonC
请参考使用 git status 命令查看 "未跟踪的文件和性能"。 - undefined
17个回答

187

您尝试过git gc吗?这会清理git仓库中的垃圾信息。


3
看起来这个方法已经起作用了。但我很惊讶,在只提交几次后,代码库里会有这么多需要清理的东西 - 谢谢! - Matt McMinn
5
哈哈,我刚刚使用time命令运行了git status,得到了30.464秒的“真实”时间。然后我运行了git gc,再次运行time git status,结果得到了35.409秒的真实时间。挺奇怪的。 - RyanScottLewis
22
这项操作将我的仓库从33秒降至1秒以下,适用于大部分代码库。如果Git开始表现得这个程度,能够提示你执行此操作就更好了。我之前从未知道需要这么做。 - XP84
2
当连续运行 git status 时,后续的运行时间只需第一次的一小部分。因此,如果您运行 git status,然后运行 git gc,再次运行 git status,预计它将运行得非常快。 - kiewic
谢谢!我尝试了几种解决方案,但只有这个简单的解决方案解决了问题。 :) - Luis Milanese

28

5
这对我有用。能否稍微解释一下? - rahul

12

你是否正在使用某种防病毒软件?这可能会干扰一些操作。Git在Windows上对于拥有数千个文件的仓库来说非常快。


1
是的,雇主强制使用趋势科技OfficeScan。我关闭了病毒扫描器,但git status的结果仍然相同。 - Matt McMinn
1
这个主题的另一个变体是即时加密软件,例如Credant,它可能会使您的计算机变得非常缓慢。 - Don Branson
这对我来说是个问题。卸载卡巴斯基杀毒软件后,状态恢复到<1秒。 - Robin Winslow
该死的杀毒软件 - 看起来反恶意软件“解决方案”所解决的问题和它们带来的问题一样多。 - Michael Burr

8

你尝试过重新打包吗?可以使用git-repack命令。

否则,可以尝试复制目录,并删除复制的目录中的.git文件夹。然后创建一个新的git目录并查看速度是否有改善。

如果速度仍然很慢,则可能是系统或硬件问题。对于我数百个文件的状态更新,Git在不到5秒内就能完成。


重新打包似乎有所帮助 - 运行后,我运行了状态命令,它立即返回。但是,我等了几秒钟后再次运行状态命令,它花费了30秒钟。我尝试复制目录,但出现了相同的问题。 - Matt McMinn
嗯,有趣。你有外部驱动器吗?或者USB闪存盘?尝试将repo复制到那里,看看是否有任何区别。当前所在的驱动器可能存在问题。 - thedz
USB驱动器上没有区别。 - Matt McMinn
这真的很奇怪。我现在只能说我不知道。你可以尝试复制你的仓库并在别人的电脑上尝试一下,这至少可以告诉你是否是你系统本地的问题。 - thedz

7

同样的问题在我身上也出现了,当我在一个已有git仓库的目录下放置另一个git仓库时,速度明显变慢。

我把第二个git仓库移动到别的地方后速度就快了!


1
我遇到了类似的问题。我的情况是在子目录中执行了git init。这样会导致子目录有点隐藏(需要在内部使用git status才能看到更改),但我猜测git仍然在尝试计算它们。我忽略了子目录,现在一切都正常了。 - mb14

6

对我来说,速度缓慢是由于有大量未跟踪的文件(脚本的临时和输出文件)。运行git status -uno,它将排除未跟踪的文件,运行速度更快,并满足我的要求。


6

在将存储库文件夹移动或复制到新位置后,git status 会变得特别缓慢。

在这种情况下,随后的运行通常会更快。


1
有没有办法避免第一次运行时的缓慢?我尝试了git gc,但没有帮助。这不是问题,因为它只会在复制文件后的第一次发生。 - franksands
我不知道有什么方法可以避免最初的缓慢,但如果有某个命令可以做到这一点,它可能正在执行与最初的 git status 命令相同的操作,因此完成所需的时间可能是相同的。 - Lex - Boycott Slack - see bio

5

我的git status非常缓慢(长达一分钟),因为全局的.gitignore文件位于我的Windows用户个人资料文件夹中,而该文件夹存储在一个不可访问的网络共享位置上。

git config --global core.excludesfile
显示类似于 \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

由于某种原因,\\Nxxxx0是不可访问的,我的用户个人资料文件夹是从备份系统 \\Nxxxxx1 加载的。花了一些时间才发现这个问题,因为通常我的用户个人资料文件夹会通过企业启动脚本绑定到一个驱动器号,而访问该驱动器号通常也能像往常一样工作。我不确定为什么git-config使用了网络共享位置,而不是驱动器号(可能是年轻时犯下的错误)

设置完成后
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git status 回复了正常速度。


2

经常由于大量未跟踪的文件,git速度非常慢。
可以尝试以下方法:

git status -uno

2

较旧版本的git在执行git status时存在性能问题-更多信息请参见提高git状态性能的方法

git 2.13有1个修复程序,2.17有更多修复程序。我从2.7升级到2.23,解决了缓慢的状态。还计划在2.24中进行另一项改进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接