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

Posted

技术标签:

【中文标题】Git 状态需要很长时间才能完成【英文标题】:Git Status Takes a Long Time to Complete 【发布时间】:2009-07-26 04:59:42 【问题描述】:

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

【问题讨论】:

你使用的是哪个 git 版本?请考虑在 msysGit Google Group 或 git 邮件列表(git [at] vger.kernel.org,您不需要订阅)上寻求帮助,也许这是 git 中的一个错误。 Ways to improve git status performance的可能重复 【参考方案1】:

你试过git gc吗?这会清除 git repo 中的垃圾。

【讨论】:

这似乎成功了。我很惊讶,尽管只提交了几次,存储库就会有这么多可以清理的东西 - 谢谢! 呵呵,我刚刚使用time 命令运行git status,得到了30.464 秒的“真实”时间。然后我再次运行git gc 然后time git status 并获得了35.409s 的实时时间。很奇怪。 这将我的大部分存储库从 33 秒缩短到不到 1 秒。如果 Git 在您开始达到这一点时会告诉您这样做,那就太好了。我从不知道需要它。 连续多次运行git status 时,后续运行只占第一次运行的一小部分。所以,如果你运行git status,然后是git gc,然后又是git status,预计它会运行得非常快。【参考方案2】:

运行 git fsck 过去已经为我解决了这个问题。

【讨论】:

这对我有用。可以解释一下。【参考方案3】:

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

【讨论】:

是的,雇主强制要求 TrendMicro OfficeScan。我杀死了病毒扫描程序,结果与 git status 相同。 这个主题的另一个变体是即时加密软件,例如 Credant,它可以让你的盒子显着变慢。 这对我来说是个问题。杀死卡巴斯基杀毒软件,状态恢复到 【参考方案4】:

您是否尝试过重新包装? git-repack.

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

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

【讨论】:

repack 似乎有帮助 - 运行它后,我运行了 status,它立即返回。但是,我等了几秒钟,再次运行状态,花了 30 秒。我尝试复制目录,但遇到了同样的问题。 嗯,很有趣。你有外部驱动器吗?还是 U 盘?尝试复制那里的回购,看看是否有任何区别。当前所在的驱动器可能存在问题。 在 USB 驱动器上没有区别。 这真的很奇怪。在这一点上我真的只能说我不知道​​。您可以尝试复制您的存储库并在其他人的计算机上进行尝试——这至少应该告诉您这是否是您系统本地的问题。【参考方案5】:

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

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

【讨论】:

我添加了类似的问题。发生的事情是 git init 在子目录中。问题在于,subdir 有点隐藏(你需要在里面做 git status 才能看到变化),但我猜 git 仍在尝试计算它们。我忽略了子目录,现在一切都很好。【参考方案6】:

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

在这种情况下,后续运行通常更快。

【讨论】:

有没有办法在第一次运行时避免这种缓慢?我尝试了 git gc,但它没有帮助。这不是问题,因为它只在复制文件后的第一次发生。 我不知道有什么方法可以避免最初的缓慢,但是如果有一些命令可以做到这一点,它可能会和最初的git status 命令做同样的事情,所以会可能需要相同的时间才能完成。【参考方案7】:

我的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.txtgit status恢复正常速度。

【讨论】:

【参考方案8】:

对我来说,速度慢是因为有很多未跟踪的文件(脚本中的临时和输出文件)。运行git status -uno,不包括未跟踪的文件,运行速度更快,并且符合我的要求

【讨论】:

【参考方案9】:

旧版本的 git 存在 git status 的性能问题 - 请参阅 Ways to improve git status performance 了解更多信息。

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

【讨论】:

【参考方案10】:

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

git status --ignored”,当注意到一个目录没有任何 跟踪的路径被忽略,仍然枚举所有被忽略的路径 目录,这是不必要的。 代码路径已经过优化以避免这种开销。

参见Jameson Miller (jamill) 的commit 5aaa7fd(2017 年 9 月 18 日)。(由 Junio C Hamano -- gitster -- 合并于 commit 075bc9c,2017 年 9 月 29 日)

提高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     |

如需更多改进(设置于 Git 2.17,2018 年第二季度),请参阅 this answer。

【讨论】:

此处完全随机示例:node_modules 可能会受到此性能更改的影响。只是也许。【参考方案11】:

在我的例子中,这个 git 目录中有一个巨大的 ZIP 文件。 *.zip 也是 .gitignore 文件中的一行:

CMakeCache.txt
CMakeFiles
Makefile
cmake_install.cmake
[...]
*.csv
*.zip
[...]

我已将此 zip 文件 (~915 MB) 移动到其他文件夹,这解决了问题。

【讨论】:

【参考方案12】:

在我的例子中,运行速度慢是由于以不同于项目中文件所有者的用户身份运行 git status 造成的。

虽然并非在所有情况下都适用,但对您当前的用户发送一个简单的chown 就可以解决问题。

【讨论】:

【参考方案13】:

对我来说,问题是我有很多不同的存储库克隆到我的本地硬盘驱动器上,你拥有的存储库越多,运行 git status 等命令所需的时间就越长。

我只是删除了很多本地不再需要的repos,我的git状态从1分钟到5秒。

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

【讨论】:

我认为这不会以任何方式影响您在一个目录中运行的标准git status。如果您的存储库被检出到不同的目录中,您一次只能为其中一个运行git status。如果您的 git 存储库重叠,情况可能会有所不同,但无论如何这都是个坏主意。 @HubertGrzeskowiak 绝对可以。它们对我来说都在我硬盘上的不同位置,但它极大地影响了我在输入 git status 时的加载时间。删除重复的存储库后,它立即变得更快,从几分钟到 5 秒。【参考方案14】:

尝试从结帐的全新克隆开始。

git clone myrepo mynewrepo

然后在 mynewrepo 中执行 git status。

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

git clean -dfx

这避免了 git 必须扫描一些(可能很大)被忽略或未签入的文件集。

【讨论】:

我认为删除所有被忽略的文件(git clean 所做的)不会有帮助,它已经忽略了它们。更有可能运行 git clean 会删除你所有的配置文件等。而且这个命令是不可撤销的。重新克隆(首先保存旧的存储库以备不时之需)比运行 git clean 效果要好得多。 我不同意这个答案,运行 git clean -dfx 可能会破坏事情。

以上是关于Git 状态需要很长时间才能完成的主要内容,如果未能解决你的问题,请参考以下文章

Python 请求很慢并且需要很长时间才能完成 HTTP 或 HTTPS 请求

AWS Glue 需要很长时间才能完成

简单连接的问题需要很长时间才能完成

状态栏颜色在ios中需要很长时间才能改变(仅第一次)[重复]

clamav cl_scanfile 需要很长时间才能完成

异步任务进度对话框需要很长时间才能完成 android 中的简单任务