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

436

您可以通过运行三个命令来设置一些配置选项,从而显著加快Windows上的Git速度:

git config --global core.preloadindex true
git config --global core.fscache true
git config --global gc.auto 256

注:

  • core.preloadindex 并行执行文件系统操作,以隐藏延迟(更新:在 Git 2.1 中默认启用)

  • core.fscache 解决了 UAC 问题,因此您不需要以管理员身份运行 Git(更新:在 Git for Windows 2.8 中默认启用)

  • gc.auto 最小化 .git/ 目录中的文件数量


没有帮助到我,但是下面提到的导出PS1='$'有所帮助。所以我知道对我来说问题在于终端行。 - Koshmaar
78
2017年(git 2.12)中存在完全无用的设置,因为所有这些东西都已默认启用。但是Git仍然像垃圾一样缓慢运行。 - ieXcept
1
将文件限制在256个可能会导致一些问题。而新版本的git已经启用了前两个选项。 - nPcomp
@sonyvizio 那是一个已经关闭的陈旧问题,两年内没有任何评论,并且 git gc 问题似乎在那之前就已经得到解决了。我认为除非你正在运行一个非常旧的 git 版本,否则这不相关。 - shoelzer
谢谢。这个解决方案已经提高了速度。但是还没有达到Linux Git命令的水平。 - rashok
显示剩余2条评论

113

你的Bash提示符中是否显示Git信息?如果是这样,也许你无意中在每个命令中都执行了太多的工作。为了测试这个理论,请尝试在Bash中进行以下临时更改:

export PS1='$'

16
问题出在 $(__git_ps1) 上...将其移除后,一切都变得非常快。 - Hendy Irawan
13
对于我们中的新手,这个命令到底是做什么的?你说它是“临时的”,那么我们如何恢复该命令? - Immortal Blue
6
已修复我的性能问题。要永久解决,编辑C:\Program Files (x86)\Git\etc\profile文件,将添加__git_ps1PS1的if-then-else注释掉即可。 - Tom
7
在当前的版本2.18.0中,我在/etc/profile里找不到__git_ps1命令了。它被移到其他地方了吗? - keinabel
16
似乎已经移动到 C:\Program Files\Git\etc\profile.d\git-prompt.sh 文件中。我在那个文件里注释掉了 __git_ps1,速度明显加快了(但是提示信息中失去了分支信息)。 - Miyagi
显示剩余13条评论

93

我的Windows主目录位于网络上,我怀疑Git Bash命令首先在那里查找。果然,在查看$PATH时,它首先列出了/h/bin,其中/h是Windows文件服务器上的共享,尽管/h/bin不存在。
我编辑了/etc/profile并注释掉了将其放在$PATH中第一位的导出命令:

#export PATH="$HOME/bin:$PATH"

这使我的命令运行得更快,可能是因为Git Bash不再通过网络寻找可执行文件了。 我的/etc/profilec:\Program Files (x86)\Git\etc\profile


6
我曾经遇到同样的问题。我将 HOME="$(cd "$HOME" ; pwd)" 更改为 HOME="$(cd "$USERPROFILE" ; pwd)",现在一切都飞快了。感谢这个提示。 - Jon Sagara
2
我成功地使用了这个变化:在配置文件中,将$HOME强制设置为$USERPROFILE,删除$HOMEDRIVE的引用。此外,在Git Bash快捷方式的属性中,将“启动位置”设置为%USERPROFILE%。 - Aidan Ryan
12
这在很大程度上解决了我的问题,但是在至少 Git 2.7.2 版本中,我发现将 export 写在 /etc/profile 文件中直接写在 /etc/profile.d/env.sh 中更好。 - Jared Siirila
17
非常感谢,我也遇到了同样的问题,但是我通过创建一个名为HOME的(用户)环境变量,将其指向我想要的主目录来解决了这个问题。如果$HOME不存在,显然git bash会默认使用%USERPROFILE%。之后,git bash速度非常快。 - JHH
7
唯一有效的选项是@JHH在评论中描述的方法。在Windows用户环境变量中添加一个名为HOME的变量,并定义您所需的主目录。(控制面板->系统->高级系统设置->环境变量) - RenRen
显示剩余3条评论

55

我发现网络驱动器是性能问题的根源。HOME指向了一个缓慢的网络共享。 我无法覆盖HOMEDRIVE,但据我所见这不是一个问题。

通过右键单击桌面上的计算机->属性->高级系统设置->环境变量来设置环境变量 添加到用户变量部分

HOME=%USERPROFILE%

6
这个方法有效。对于所有遇到网络问题的人来说,这是真正的解决方案。你不需要编辑任何配置文件,只需将“HOME”指向正确的位置即可。 - Carlos Calla
2
定义环境变量HOME为%USERPROFILE%无效。我定义了系统变量:HOME=C:\Users\myUserName。 - colin_froggatt
对我有用!谢谢。我做了类似@colin_froggatt的事情,但是在用户环境变量中设置了HOME=C:\Users\myUserName。 - Ð..
在2020年使用Windows 10时,HOME变量被取消设置,赋予了默认值,这使得我之前糟糕的git性能得到了恢复。 - glenatron
这对我有用。谢谢你的帮助!Windows 10 - Paul Wang
这对我来说非常有效,我会说这是最简单和最好的解决方案。 - Tech Sawy

29

对于 Chris Dolan 答案的补充,在我的回答中,我使用了以下替代的 PS1 设置。只需将代码片段添加到您的 ~/.profile 文件中(在 Windows 7 上:C:/Users/USERNAME/.profile)。

fast_git_ps1 ()
{
    printf -- "$(git branch 2>/dev/null | sed -ne '/^\* / s/^\* \(.*\)/ [\1] / p')"
}

PS1='\[\033]0;$MSYSTEM:\w\007
\033[32m\]\u@\h \[\033[33m\w$(fast_git_ps1)\033[0m\]
$ '

这保留了有色的shell和显示当前分支名称(如果在Git存储库中),但在我的机器上速度显着提高,从约0.75秒到0.1秒。

这基于这篇博客文章


1
非常好的答案。但是我已经决定在我的~/.bashrc中重新定义'__git_ps1()',并只打印空字符串。这会加速所有Bash命令。 - ajukraine
我是一个 Git 初学者,想了解这个 fast_git_ps1 和原始的相当复杂的 __git_ps1 有什么区别。我认为它可以适用于大多数“常规”情况,但是什么是常规,以及在哪里会失败? - Sundar R
我不知道它会失败的情况。我之前确实使用过__git_ps1,但是注意到了性能问题,所以我尝试调整让git做更少的工作来提取显示的信息。 - Wilbert
3
原始的 __git_ps1 包含状态信息,不仅仅是分支名称。例如,如果您处于分离头状态,在 git 目录中,在裸仓库中,在执行 cherry picking、rebasing 或 merging 操作时... 这将更快,但在某些情况下,您可能会错过这些额外的信息,特别是对于 Git 初学者来说。 - Drew Noakes

23
虽然您的问题可能是基于网络的,但我个人通过做两个修改使本地的git status调用加速了十倍(从7秒降至700毫秒)。这是在一个有21,000个文件和过多数量的大型二进制文件的700 MB存储库上进行的。
其中一个是启用并行索引预加载。从命令提示符中执行以下命令: git config core.preloadindex true 这将把time git status从7秒改为2.5秒。
更新! 以下不再需要。自mysysgit 1.9.4以来,已修复此问题。 https://github.com/msysgit/git/commit/64d63240762df22e92b287b145d75a0d68a66988 但是,您必须通过输入以下命令来启用修复: git config core.fscache true 我还禁用了UAC和"luafv"驱动程序(需要重新启动)。这会禁用Windows Vista、7和8中的一个驱动程序,该驱动程序重定向试图写入系统位置的程序,并将这些访问重定向到用户目录。
要了解此对Git性能的影响,请阅读以下讨论:https://code.google.com/p/msysgit/issues/detail?id=320 要禁用此驱动程序,在regedit中,将"HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / luafv"处的"start"键更改为4以禁用驱动程序。然后,将UAC设置为最低级别,即"从不通知"。
如果禁用此驱动程序使您感到担忧(应该会),另一种选择是在与系统分区不同的驱动器(或分区)上运行。显然,该驱动程序仅在对系统分区进行文件访问时运行。我有第二个硬盘,并且在我的C驱动器上使用此注册表修改时,结果与我在D驱动器上未使用此修改时相同。
此更改将"time git status"从2.5秒降至0.7秒。

您可能还想关注https://github.com/msysgit/git/pull/94https://github.com/git/git/commit/d637d1b9a8fb765a8542e69bd2e04b3e229f663b,以了解正在进行的有关Windows速度问题的额外工作。


12
这只是再次揭示了微软的愚蠢和曲折解决方案,而UNIX在1968年就以简单优雅的方式解决了这些问题。由于微软的臃肿、缺乏重构/灵活性/胆识,全球有多少生产力、时间和金钱被浪费? - v.oddou
26
我还记得在68年使用git时感觉非常棒。 - Charlie Brown
2
哈哈,在林纳斯出现之前一年,@CharlieBrown - cchamberlain
1
默认情况下在Git 2.1中启用 https://dev59.com/uW855IYBdhLWcg3wMBPV#24045966 - Alex78191

21

看起来完全卸载Git并重新启动(Windows的经典解决方法),然后重新安装Git是解决方案。我还清除了所有剩余的bash配置文件(它们是手动创建的)。现在一切都快了。

如果因某种原因无法重新安装Git(或不希望重新安装),那么我肯定会尝试更改Chris Dolan的答案中提到的PS1变量;它在某些操作中导致了显著的加速。


4
重新安装而不重启电脑没有生效,卸载后重启电脑再安装才行。谢谢!不过能了解一下为什么Bash会变得这么慢,以及如何解决这个问题就更好了。 - Gauthier
我已经从msysgit v1.7升级到v1.8.1.2,但速度仍然很慢... 卸载、重启、安装解决了问题,谢谢! - Herr Grumps
3
你究竟删除了哪些 Bash 配置文件? - Scott
我确认这个方法。卸载 Git,重启系统,重新安装 Git。这个方法对我很有效。现在 Gitbash 运行速度非常快。 - Andrzej Rehmann
5
这不是解决方案的答案。当你卸载并重新安装时,某些配置文件可能已更改,这些更改就是答案。如果你只说重新安装是解决方案,那就是错误的。其他人可能卸载和重新安装,但配置文件可能是相同的,这就是为什么它对每个人都不起作用的原因。 - Carlos Calla
显示剩余4条评论

9
我通过以“管理员身份运行”cmd.exe来解决了我的Windows 7 x64上的Git速度慢的问题。

10
这个问题涉及到 Git Bash。 - manojlds
2
你可以以管理员身份运行git bash;这可能表明存在UAC问题。 - krosenvold
4
哇,以管理员身份运行 Git Bash 速度大幅提升。 - Evil E
我不确定为什么这个答案只有6个赞。我认为这个答案完全解决了问题。速度有了巨大的提升。 - Codex
3
@vinoth10 你知道,以管理员身份运行的问题是存在的。出于许多原因,这是一个不好的想法,并且对于许多企业使用情况来说根本不是一个选择。通过提高用户权限来解决性能问题是一个可怕的解决方案。 - JHH
除了@JHH的重要备注之外,这对我的情况也没有帮助。 - bjhend

7

7

通过更改以下Git配置,您可能还会获得非常显著的性能提升:

git config --global status.submoduleSummary false

当在Windows 7 x64上运行简单的git status命令时,需要超过30秒才能完成。定义此选项后,命令立即执行。通过激活Git自身的跟踪功能,如下页面所述,可以找到问题的根源,该问题可能在您的安装中有所不同:https://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-slow

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