Git Bash在Windows 7 x64上非常缓慢

467
我在开发一个小项目时,在Windows和Ubuntu上都使用了Git,并经常在两者之间切换。问题是,Git Bash 经常变得很慢。
当我说慢的时候,我指的是运行 cd 命令需要8-25秒,运行 git 命令需要5-20秒,而 ls 命令有时会花费多达30秒的时间。不用说这很烦人,更不用说这样效率很低。我知道Git在Windows上速度较慢,但这太过分了。
唯一有效但是临时的解决方案是禁用网络连接(建议见这个答案),启动Git Bash, 然后重新连接。有时它会继续快速运行数天,但性能总会最终恶化。我已经在msysgit讨论组、Stack Overflow、msysgit问题列表等地方搜索了几周,但我还没有找到有效的解决方案。
到目前为止,我尝试过:
  • 将Git和项目文件夹添加到杀毒软件的排除列表中
  • 完全禁用我的杀毒软件(Kaspersky IS 2011)
  • 确保Outlook没有运行(Outlook 2007)
  • 关闭所有其他应用程序
  • 以管理员身份运行Git Bash
  • 禁用网络连接,启动Git Bash,并保持连接不变
  • 禁用网络连接,启动Git Bash,重新启用连接(仅在偶尔情况下有效)
  • 运行 git gc
  • 以上的组合尝试。

我读到有几个人成功禁用了Bash自动补全,但是我希望保持其激活状态。msysgit的版本是1.7.3.1-preview20101002,操作系统是Windows 7 x64。在Linux上运行相同的命令会非常快。我想完全使用Linux,但我也需要在Windows上运行一些东西(某些应用程序,测试等)。

是否有人遇到过类似的问题?如果有,问题的根源是什么,解决方案是什么(如果有)?

这不仅限于Git存储库,但只是作为参考,我使用Git的存储库相当小:最多约4-50个文件。


1
不要泄气,但是Cygwin在x64上非常慢,你最好在32位的Windows XP上尝试它。 - ismail
6
在同一台电脑上,半年前不会这么慢。他们肯定更改了什么东西... - Tomáš Zato
2
在几乎所有的机器上:卡巴斯基杀毒软件会严重拖慢Git的速度,并且“禁用”卡巴斯基也无效,即使完全退出后,avp.exe仍然在运行。通常情况下,完全重新安装卡巴斯基可以解决后面的问题。 - peterchen
2
请查看 msysgit 的维基页面:https://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-slow。 - Drew Noakes
显示剩余2条评论
25个回答

1

以上所有方法都无法帮助我。在我的情况下,问题表现为:

  • 任何ls -l命令都很慢(需要大约3秒钟才能执行)
  • 任何后续的ls -l命令都会立即执行,但只有在前一个ls命令之后的45秒内执行。

在使用Process Monitor进行调试时,发现在每个命令之前都有一个DNS请求。

因此,一旦我禁用了防火墙(在我的情况下是Comodo),并让命令执行,问题就解决了。当防火墙重新打开时,问题不会再次出现。我将尽快更新此响应,以获取有关哪个进程正在执行阻止DNS请求以及目标是什么的更多详细信息。


0

这对于“stash”有所帮助,但是你的帖子是第一个特别提到“stash”的。它会影响其他Git操作吗? - Michael
据我所知,不行。目前有两个实验性功能处于预览状态,允许使用本机可执行文件进行stash和/或rebase以获得更好的性能,但是对于任何预览内容,总会存在一些小的副作用的风险。 - bergmeister
1
此功能已在版本2.19.1中退出预览,因此您不再有此选项。 - bergmeister

0

我发现了两个有帮助的诊断方法,来自于git repo wiki: https://github.com/git-for-windows/git/wiki/Diagnosing-performance-issues

基本上,在<git安装目录>/etc/profile的顶部添加set -x,它将会回显实际执行的shell命令。这样你就可以找出哪个命令导致了提示延迟。

但在我的情况下,主要是那些网络操作。我在我的git命令前面加了GIT_TRACE=1,这样它就会打印出它执行的子git命令。

在我的情况下,我发现git-credential-manager get被多次执行,并且每次调用都需要等待几秒钟。所以在搜索后,我尝试在管理员模式下运行git config --system --unset credential.helper。现在Sourcetree很快了,尽管我需要在git bash中每次重新输入凭证。

有些人怀疑这是由于杀毒软件引起的,但我现在无法验证。 https://github.com/Microsoft/Git-Credential-Manager-for-Windows/issues/786


0
我的一位同事在Windows(7)上使用Git时遇到了麻烦。 git statuscheckoutadd很快,但是git commit却非常慢。
我们仍在努力找到问题的根本原因,但将存储库克隆到新文件夹中解决了他的问题。

-1

我也遇到了git PS1速度慢的问题,尽管很长一段时间我一直认为这是一个数据库大小问题(大型仓库),并尝试各种git gc技巧,并像你一样寻找其他原因。然而,在我的情况下,问题出在这一行代码上:

function ps1_gitify
{
   status=$(git status 2>/dev/null )      # <--------------------
   if [[ $status =~ "fatal: Not a git repository" ]]
   then
       echo ""
   else
       echo "$(ps1_git_branch_name)  $(ps1_git_get_sha)"
  fi
}

为每个命令行状态行执行git status是很慢的。糟糕。这是我手写的东西。当我尝试时,我发现这是一个问题。

export PS1='$'

就像这里的一个答案中提到的那样。命令行非常快。

现在我正在使用这个:

function we_are_in_git_work_tree
{
    git rev-parse --is-inside-work-tree &> /dev/null
}

function ps1_gitify
{
    if ! we_are_in_git_work_tree
    then
    ...

从Stack Overflow的帖子PS1 line with git current branch and colors中,它运行良好。再次拥有快速的Git命令行。

你的问题是由你编写的脚本引起的吗?也许对于其他搜索相同问题的用户来说,那个脚本不太可能是原因。 - Jolta
看一下 OP 的问题 - 他提到了很多他已经检查过的东西,但还是没有找到答案。我也遇到了同样的问题。所以我在这里添加了另一件事情,在没有帮助的情况下进行检查。而且重要的不是我编写的特定脚本,而是一个概念 - 看看你的 PS1。 - Koshmaar

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