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个回答

1
在我的情况下,这个git目录中有一个非常大的ZIP文件。同时*.zip.gitignore文件中的一行:
CMakeCache.txt
CMakeFiles
Makefile
cmake_install.cmake
[...]
*.csv
*.zip
[...]

我已将这个大小约为915MB的zip文件移动到其他文件夹中,这解决了问题。


1
在我的情况下,问题在于我所在的互联网提供商不支持IPv4。
SSH支持IPv4和IPv6,并且如果DNS检索到AAAA记录,则优先使用IPv6,但是我的ISP不支持IPv6,这会导致巨大的延迟。
我能够通过atlassian社区上的giridharkannan找出这个问题。
他们建议更改/etc/ssh/ssh_config文件,以便包含以下行:
AddressFamily inet

然而,我正在使用Windows。设置IPv4地址并不能让SSH忽略IPv6,执行git pullgit push仍然需要很长时间。
因此,最终我添加了一个-4标志,可以将其附加到ssh上,以强制使用IPv4,这对于git pullgit push都有效。
git pull -4
git push -4

这也适用于*nix,无需更改ssh_config文件。 这里有一个更详细的答案,介绍如何强制git使用IPv4或IPv6。

1
对于您不进行版本控制的文件,请参阅 "未跟踪的文件和性能",使用 git status

另外,在 git status 显示被忽略的文件时(git status --ignored),Git 2.14.x/2.15(2017年第四季度)中将改进其它方面。

当发现一个没有任何跟踪路径的目录被忽略时,"git status --ignored" 仍然会枚举该目录中所有被忽略的路径,这是不必要的。
代码路径已经优化,以避免这种开销。

请查看提交5aaa7fd(2017年9月18日)由Jameson Miller(jamill进行。
(由Junio C Hamano -- gitster --提交075bc9c中合并,2017年9月29日)

改善git status --ignored的性能

优化目录列表逻辑以提高非空忽略目录的性能。为了显示非空忽略目录,现有逻辑将递归遍历所有被忽略目录的内容。
此更改引入了优化,一旦找到第一个文件,就停止遍历其余内容。这可以显著提高在具有大量被忽略目录中的文件的存储库中执行“git status --ignored”的性能。

以下是具有196,000个文件和400个被忽略目录的示例存储库的性能差异示例:

| 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 可能会受到这个性能变化的影响。也许吧。 - Seth Battin

0
在我的情况下,速度慢是由于使用与项目文件所有者不同的用户运行 git status 导致的。
虽然不是在所有情况下都适用,但简单地将当前用户更改为所有者可能会解决问题。

0

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


-1
对我来说问题是我在本地硬盘上克隆了很多不同的存储库,你拥有的存储库越多,运行像git status这样的命令所需的时间就越长。
我只是删除了很多我不再需要的本地存储库,我的git状态从1分钟左右降到了5秒钟。
我在这里看不到任何类似的答案。

1
我认为这不会以任何方式影响您在一个目录中运行的标准 git status。如果您的存储库已检出到不同的目录中,每次只能为其中一个运行 git status。如果您的 git 存储库重叠,那可能是个不同的故事,但这本来就是个坏主意。 - Hubert Grzeskowiak
@HubertGrzeskowiak,它肯定可以。对我来说,它们分散在硬盘的不同位置,但当我键入git status时,它极大地影响了我的加载时间。删除重复的存储库后,它立即从多分钟变为5秒钟更快。 - Jack Perry

-16

尝试使用您的检出的新克隆开始。

git clone myrepo mynewrepo

然后在我的新存储库中执行git状态。

或者,如果你更勇敢一些,可以清理现有检出中的垃圾。

git clean -dfx

这样可以避免Git扫描一些被忽略或未检入的文件,其中可能包含大量数据。


我认为删除所有被忽略的文件(即git clean所做的)并不能帮助你,因为它已经忽略了它们。更有可能的是,运行git clean会删除所有配置文件等等。而且这个命令是不可撤销的。重新克隆(首先保存旧的存储库以防需要)比运行git clean要好得多,并具有相同的效果。 - XP84
5
我不同意这个答案,运行 git clean -dfx 可能会破坏一些东西。 - Marcel Valdez Orozco

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