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


85

git用来管理Windows机器上本地目录中的文件-这里不涉及网络,我不是在从另一台机器上推入/拉出。我的目录中可能包含100个文件,所有测试文件都非常小。当我跑步时git status,通常需要20-30秒才能完成。这正常吗?有什么我可以做来加快速度的方法,还是一种更好的方法来查看存储库的状态(更改的文件,未跟踪的文件等)?其他git命令似乎可以更快地完成。


您正在使用哪个git版本?请考虑在msysGit Google网上论坛或git邮件列表(git [at] vger.kernel.org,您不需要订阅)上寻求帮助,也许这是git中的错误。
JakubNarębski09年

Answers:


127

您尝试过git gc吗?这可以清除git repo中的残留文件。


3
这似乎已经解决了问题。我很惊讶,尽管仅几次提交,该存储库中就有那么多可以清除的内容-谢谢!
马特·麦克明

4
呵呵,我只是运行了git status使用time命令,并获得了30.464s的“真实”时间。然后我跑了git gc那么time git status多次,并获得35.409s的实时性。很奇怪
RyanScottLewis

14
对于大多数存储库,这使我从33秒降低到不到1秒。如果Git在开始达到这一点时告诉您执行此操作,那就太好了。我不知道这是必需的。
XP84 2013年

当连续运行git status多次时,后续运行仅占第一次运行的一小部分。所以,如果你正在运行git status,然后git gcgit status再次,它预计它会超快运行。
keewic

7

在类似的问题上,我发现在现有git repo下的目录中有git repo会导致速度大大降低。

我将辅助git repo移动到其他地方,现在速度很快!


我添加类似的问题。发生的是git init在子目录中。那么问题是,subdir是一种隐藏的(您需要在内部进行git status才能查看更改),但是我猜git仍在尝试计算它们。我忽略了子目录,现在一切都很好。
mb14 2013年

6

您是否正在使用某种病毒防护软件?也许那是干扰事物。git在拥有1000个文件存储库的Windows上,对我来说非常快。


1
是的,雇主要求使用趋势科技防毒墙网络版。我杀死了病毒扫描程序,结果与git status相同。
马特·麦克明

1
此主题的另一个变种是即时加密软件,例如Credant,它可以使您的机器运行速度明显变慢。
唐·布兰森

这是我的问题。卡巴斯基杀毒软件被杀死,状态恢复到<1秒。
罗宾·温斯洛

5

您是否尝试过重新包装?混帐重新包装

否则,请尝试复制目录,然后删除重复目录中的.git文件夹。然后创建一个新的git目录,看看它是否仍然很慢。

如果仍然很慢,则听起来像是系统或硬件问题。Git在不到5秒的时间内为我完成了数百个文件的状态。


重新打包似乎有帮助-运行它之后,我运行了状态,并立即返回。但是,我等待了几秒钟,然后再次运行状态,这花了30秒。我尝试复制目录,并遇到相同的问题。
马特·麦克明

嗯,有趣。你有外置硬盘吗?还是USB随身碟?尝试将存储库复制到那里,看看是否有任何区别。当前驱动器可能存在问题。
thedz

USB驱动器上没有差异。
马特·麦克明

真的很奇怪 我现在只能说不知道。您可以尝试复制您的存储库,然后在其他人的计算机上进行尝试-至少应该告诉您它是否是系统本地的问题。
thedz

4

由于某些原因 git status在将存储库文件夹移动或复制到新位置后,它特别慢。

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


1
有没有办法避免在第一次运行中出现这种缓慢情况?我尝试了git gc,但没有帮助。这不是问题,因为它仅在复制文件后的第一次发生。
franksands,

我不知道一种避免初始速度慢的方法,但是如果有一些命令可以做到,那么它可能会执行与初始git status命令相同的操作,因此可能需要花费相同的时间才能完成。
DanJAB

4

我的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后恢复到正常速度。


3

git fsck过去,跑步已经为我解决了这个问题。


3

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


1

对我来说,问题是我在本地硬盘上克隆了许多不同的存储库,存储库越多,运行git status等命令所需的时间就越长。

我只是删除了很多本地不再需要的存储库,我的git状态从1分钟变为5秒。

我在这里看不到任何类似的答案。


1
我认为这不会git status以任何方式影响您在一个目录中运行的标准。如果您的存储库检出到不同的目录,则一次只能运行git status其中一个。如果您的git仓库重叠,则可能是另外一个故事,但这还是个坏主意。
休伯特·格热斯科维克

@HubertGrzeskowiak绝对可以。对于我来说,它们都在我硬盘上的不同位置,但是在键入git status时,这极大地影响了我的加载时间。删除重复的存储库后,它立即从几分钟到5秒变得更快。
杰克·佩里

1

另一个方面git status将得到改进(在Git 2.14.x / 2.15,2017年第4季度),当它也显示忽略的文件时(git status --ignored

git status --ignored”,当注意到没有任何跟踪路径的目录被忽略时,仍会枚举目录中所有被忽略的路径,这是不必要的。
已对代码路径进行了优化,以避免这种开销。

参见Jameson Miller()的commit 5aaa7fd(2017年9月18日(通过合并JUNIOÇ滨野- -提交075bc9c,2017年9月29日)jamill
gitster

提高性能 git status --ignored

当要列出非空的被忽略目录时,提高目录列出逻辑的性能。为了显示非空的被忽略目录,现有逻辑将递归遍历被忽略目录的所有内容。
此更改引入了优化,以在找到第一个文件后停止遍历内容。这可以显着改善在被忽略目录中包含大量文件的存储库中的“ git status --ignored”性能。

有关示例存储库中的性能差异的示例,该存储库在400个被忽略的目录中包含196,000个文件:

| Command                    |  Time (s) |
| -------------------------- | --------- |
| git status                 |   1.2     |
| git status --ignored (old) |   3.9     |
| git status --ignored (new) |   1.4     |

如需更多改进(在2018年第二季度的Git 2.17中设置),请参见此答案


这里node_modules是完全随机的示例:此性能变化可能会对其产生影响。也许吧。
塞斯·巴丁

1

较旧版本的git具有git status的性能问题-有关更多信息,请参见提高git status性能的方法

git 2.13有1个修复,另外还有2.17个。我从2.7移至2.23,它解决了慢速状态。计划在不久的将来完成2.24的另一项改进。


0

在我的情况下,运行缓慢是由于git status以与项目中文件所有者不同的用户身份运行而引起的。

尽管并非在所有情况下都适用,但chown对您当前的用户来说简单的方法可能会成功。


-13

尝试从结帐的全新副本开始。

git clone myrepo mynewrepo

然后在mynewrepo中执行git status。

或者,如果您很勇敢,请清除现有结帐中的垃圾。

git clean -dfx

这样可以避免git扫描某些(可能很大)被忽略或未签入的文件。


我认为删除所有忽略的文件(git clean所做的事情)不会有所帮助,因为它已经忽略了它们。运行git clean更有可能会删除所有配置文件等,并且此命令不可撤消。重新克隆(如果需要,首先保存旧的存储库)比运行git clean更好,并且具有相同的效果。
XP84 2013年

5
我不得不不同意这个答案,运行git clean -dfx可能会破坏事情。
Marcel Valdez Orozco
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.