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

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

77648 次浏览

你试过重新包装吗。

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

If it's still slow, then it sounds like a system or hardware issue. Git finishes status on hundreds of files for me in less than 5 seconds.

Are you using some kind of virus protection software? Maybe that is interfering with things. git is very fast for me on windows with repositories of 1000's of files.

你试过 一个 href = “ https://git-scm.com/docs/git-gc”rel = “ nofollow norefrer”> git gc 吗? 这个可以清除废料回收。

试着从一个新的结账克隆开始。

git clone myrepo mynewrepo

然后在我的新报上做 Git 状态。

或者,如果你更勇敢,清理现有结账处的垃圾。

git clean -dfx

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

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

我把第二次 Git 回收移到别的地方了,现在速度很快!

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

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

在我的例子中,缓慢是由于作为与项目中文件的所有者不同的用户运行 git status造成的。

虽然不适用于所有实例,但是对于当前用户来说,一个简单的 chown就可以解决这个问题。

git status的另一个方面将得到改进(在 Git 2.14中)。X/2.15,Q42017)也显示被忽略的文件(git status --ignored)

git status --ignored”,当注意到一个目录没有任何 tracked path is ignored, still enumerated all the ignored paths in 目录,这是不必要的。
为了避免这种开销,已经对代码路径进行了优化。

承诺5aaa7fd(2017年9月18日) by Jameson Miller (jamill)
(由 朱尼奥 · C · 哈马诺 gitster于2017年9月29日在 犯罪合并)

提高 git status --ignored的性能

当目录列表逻辑希望列出非空的忽略目录时,改进其性能。为了显示非空的忽略目录,现有逻辑将递归地遍历被忽略目录的所有内容。
此更改引入了优化,以便在找到第一个文件时停止迭代内容。对于存储库中有大量文件位于被忽略的目录中的情况,这可以显著改善“ git status ——忽略”的性能。

For an example of the performance difference on an example repository with 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,Q22018中设置) ,请参见 this answer

我的 git status非常慢(最多一分钟) ,因为全局 .gitignore文件位于我的 windows 用户配置文件中,它存储在一个不可访问的网络共享中。

git config --global core.excludesfile < br > 显示类似于 \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt的东西

由于某种原因 \\Nxxxx0无法访问,我的用户配置文件是从备份系统 \\Nxxxxx1加载的。我花了一些时间才弄清楚这一点,因为通常我的用户资料是由企业启动脚本绑定到驱动器号上的,而访问该驱动器号正常工作。 我不知道为什么 git-config 使用的是网络共享而不是驱动器号(可能是年轻的我造成的)

设置 < br > git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt < br > git status后恢复正常速度。

对我来说,问题是我有很多不同的存储库克隆到我的本地硬盘驱动器,越多的回购你将需要更长的时间来运行命令,如 git 状态。

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

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

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

Https://git-scm.com/docs/git-fsck

旧版本的 git 在性能方面存在问题,更多信息请参见 提高 git 状态性能的方法

Git 2.13有1个补丁,还有2.17个补丁。我从2.7移动到2.23,它解决了缓慢状态。2.24版本很快会有另一个改进计划。

For me, the slowness was due to having a lot of untracked files (temporary and output files from scripts.) Running git status -uno, which excludes the untracked files, ran much faster, and meets my requirements

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

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

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

由于大量未跟踪的文件,git 通常非常慢。
试试这个,

git status -uno

我不完全确定为什么是这种情况,但我有这个问题与回购使用 Git LFS 时,git-lfs没有安装。我没有安装它,因为我实际上不需要任何文件,但安装 git-lfs为我解决了速度问题。

在我的案例中,我所在的互联网提供商不支持 IPv4,这是一个问题。

SSH supports both IPv4 and IPv6 and prefers IPv6 if the DNS retrieves AAAA 记录,但我的 ISP 不支持 IPv6,这导致了巨大的 延误

多亏了 atlassian community的 giridharkannan 我才能弄明白

They suggest changing the /etc/ssh/ssh_config file so it contains the line:

AddressFamily inet

但是,我正在使用窗口。设置 IPv4地址不会让 SSH 忽略 IPv6,而且执行 git pullgit pushes 仍然需要很长时间

So, I ended up appending the -4 flag that you can append to ssh to force it to use IPv4, this works for both git pull and git push:

git pull -4
git push -4

这对 * nix 也适用,无需更改 ssh _ config 文件。

Here is an answer which goes into more detail about how to force git to use either IPv4 or IPv6.