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.txt
git 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 请求