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

6

正如克里斯·多兰和威尔伯特所说,PS1会使你变慢

与其完全禁用(多兰建议),或使用威尔伯特提供的脚本,我使用一个更快的“愚笨的PS1”。

它使用(git symbolic-ref -q HEAD || git rev-parse --short HEAD) 2> /dev/null

PS1='\033[33m\]\w \n\[\033[32m\]$((git symbolic-ref -q HEAD || git rev-parse -q --short HEAD) 2> /dev/null) \[\033[00m\]# '

在我的Cygwin上,这比Wilbert的“fast_Git_PS1”答案快- 200毫秒比400毫秒,因此它可以减少一点您的提示迟缓。

它不像__git_ps1那样复杂-例如,当您进入.git目录时它不会更改提示等,但对于日常正常使用而言已经足够快了。

这是在Git 1.7.9(Cygwin,但它应该适用于任何平台)上测试的。


您还可以使用 --short 选项来不打印 refs/heads/ - friederbluemle
@friederbluemle,你使用的是哪个版本的git?我的(1.7.9)在symbolic-ref命令中没有提供--short选项。 - sinelaw
更新后不会在任何 git 仓库之外打印错误,并且可以用于分离的 HEAD。 - sinelaw
我正在使用1.8.4(msysgit)。 - friederbluemle

6
除了其他回答之外,我通过使用并行子模块提取(自Git 2.8于2016年初以来)加快了具有多个子模块的项目的速度。
这可以通过git fetch --recurse-submodules -j8进行,并且可以通过git config --global submodule.fetchJobs 8设置,或者您想要使用的核心数量。

6

5
我遇到了相同的问题,无论是在Git Bash还是Git GUI中。这两个程序都能正常运行,但随后它们就会变得非常缓慢,而我又搞不清原因。后来发现是Avast杀毒软件惹的祸。Avast会导致各种怪异的问题(包括我自己写的程序),所以我禁用了它一下子,然后Bash就像在Linux上一样快了。我只需将Git程序文件夹(C:\Program Files\Git)添加到Avast排除列表中,现在它和Linux上一样快。
是的,我知道这篇文章的原始帖子中防病毒软件并不是问题所在,但我把它放在这里,以防对别人有用。

4

综合回答:

  1. Wilbert的回答 - PS1中应包含什么信息
  2. sinelaw的回答 - (<branch_name>)(<sha>)
# https://unix.stackexchange.com/questions/140610/using-variables-to-store-terminal-color-codes-for-ps1/140618#140618
# https://unix.stackexchange.com/questions/124407/what-color-codes-can-i-use-in-my-ps1-prompt
# \033 is the same as \e
# 0;32 is the same as 32
CYAN="$(echo -e "\e[1;36m")"
GREEN="$(echo -e "\e[32m")"
YELLOW="$(echo -e "\e[33m")"
RESET="$(echo -e "\e[0m")"

# https://dev59.com/uW855IYBdhLWcg3wMBPV#19500237
# https://dev59.com/uW855IYBdhLWcg3wMBPV#13476961
# https://dev59.com/o1kS5IYBdhLWcg3wu4vL#39518382
fast_git_ps1 ()
{
    git -C . rev-parse 2>/dev/null && echo " ($((git symbolic-ref --short -q HEAD || git rev-parse -q --short HEAD) 2> /dev/null))"
}

# you need \] at the end for colors
# Don't set \[ at the beginning or ctrl+up for history will work strangely
PS1='${GREEN}\u@\h ${YELLOW}\w${CYAN}$(fast_git_ps1)${RESET}\] $ '

Result:

frolowr@RWAMW36650 /c/projects/elm-math-kids (master) $


1
并没有使其更快 - keinabel
@keinabel 此时我会查看来自 https://blogs.msdn.microsoft.com/devops/2018/06/25/supercharging-the-git-commit-graph/ 的 core.commitGraph=true 以及其他来自 https://blogs.msdn.microsoft.com/devops/tag/git/ 的内容。 - rofrol

4
在我的情况下,Git Bash的快捷方式被设置为Start in:% HOMEDRIVE%% HOMEPATH%(您可以右键单击Git Bash并选择属性来检查此设置)。这是网络驱动器。
解决方法是将其指向%HOME%。如果您没有它,可以在环境变量中设置它,现在Git Bash应该非常快。

我认为这个答案应该有更多的投票。我来到这里想要发布同样的建议,但看到你已经比我先做了哈哈。 - Jon

2
在我的情况下,实际上是 Avast 杀毒软件导致 Git Bash 甚至 PowerShell 变得非常缓慢。
我首先尝试禁用 Avast 10 分钟,以查看它是否改善了速度,结果确实如此。然后,我将整个 Git Bash 安装目录添加到 Avast 的例外中,包括读取、写入和执行权限。在我的情况下,这是 C:\Program Files\Git\*

我想确认这个提示。从Avast中排除git确实可以加快速度。我不再需要等待就能看到git状态了。Win 7 x64 - fajarhac
杀毒软件只会干扰。 - Alex78191
1
谢谢,那绝对是一个快速的胜利! 禁用了Avast 10分钟,注意到Git表现立即改善(即返回正常执行时间)。 - Marcello Romani
这个解决方案对我有效。McAfee + Windows 10 Ent. - FractalSpace

2
我在Windows 7 x64的有限用户帐户上运行Git for Windows (msysgit)时遇到了同样的问题。根据我在这里和其他地方所读到的信息,常见的主题似乎是缺少管理员权限和/或UAC。由于我的系统关闭了UAC,因此我认为它正在尝试写入/删除程序文件目录中的某些内容,这是最有道理的解释。
无论如何,我通过使用zipinstaller安装了便携版的Git 1.8来解决了我的问题。请注意,我不得不解压缩.7z分发文件并将其重新打包为ZIP文件,以便zipinstaller能够使用。我还必须手动将该目录添加到系统路径中。
现在性能良好。尽管它安装在我没有权限访问的Program Files(x86)目录中,但似乎不会出现相同的问题。我把这归因于便携版本比较保守地写入/删除文件的位置,这可能是原因之一,或者升级从1.7到1.8。我不会试图确定哪一个是原因,总之现在运行得很好,包括Bash。

1
关闭UAC似乎解决了我们的问题(多秒延迟的“大”部分)。ps1黑客攻击完成了其余部分。 - krosenvold
我也是使用SSD,32GB内存和四核i7处理器,但其他答案都没有帮助。我已经禁用了UAC,重启电脑后,git命令立即执行。 - phil_lgr

1

我曾经遇到过类似的情况,我的问题与Active Directory和VPN有关。

在这样工作了半年后,我找到了这个宝藏:http://bjg.io/guide/cygwin-ad/

你基本上只需要在/etc/nsswitch.conf(可以在你的git目录中找到)中从passwdgroup部分禁用db,使文件看起来像:

# Begin /etc/nsswitch.conf
passwd: files
group: files
db_enum: cache builtin
db_home: cygwin desc
db_shell: cygwin desc
db_gecos: cygwin desc
# End /etc/nsswitch.conf

然后更新您的本地密码和组设置:

$ mkpasswd -l -c > /etc/passwd
$ mkgroup -l -c > /etc/group

1
如果您使用Git命令行,请尝试从Git Bash中运行它。在命令行中,git.exe实际上是一个包装器,每次启动时都会设置正确的环境,然后才启动真正的git.exe。这可能需要两倍于您所需时间的时间。而Git Bash只在启动时设置环境。

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