在Windows 7 x64上,Git Bash非常慢

Gem*_*i14 418 git bash msysgit mingw32 windows-7

在一个小项目的开发过程中,我一直在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个文件.

sho*_*zer 398

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

git config --global core.preloadindex true
git config --global core.fscache true
git config --global gc.auto 256
Run Code Online (Sandbox Code Playgroud)

笔记:

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

  • core.fscache 修复了UAC问题,因此您无需以管理员身份运行Git(更新:默认情况下在Git for Windows 2.8中启用)

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

  • 2017年完全无用的设置(git 2.12)因为所有这些东西都是默认启用的.但是git仍然像一个狗屎一样慢慢地运作. (61认同)
  • 看起来像是魔术的那个是core.fscache (6认同)
  • 在Windows 10上也很好用。做得好&感谢您使用@shoelzer! (2认同)

Chr*_*lan 93

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

export PS1='$'
Run Code Online (Sandbox Code Playgroud)

  • 对于我们中间没有经验的人来说,这个命令到底是做什么的?你说它是"临时的",我们如何恢复命令? (9认同)
  • 问题在于`$(__ git_ps1)`...删除这使得一切都超高速 (8认同)
  • 它似乎已移至C:\ Program Files\Git\etc\profile.d\git-prompt.sh.我在那个文件中注释掉了__git_ps1并且速度更快了(但是在提示中丢失了分支信息) (7认同)
  • 在当前版本2.18.0中,我可以在/ etc/profile中找到__git_ps1命令.它移动到其他地方了吗? (5认同)
  • 还解决了我的性能问题.要永久修复,编辑`C:\ Program Files(x86\Git\etc\profile`并注释掉if-then-else,其中`__git_ps1`被添加到'PS1`. (3认同)
  • @ Gemini14 - 很好.这意味着您的Bash shell配置为在shell提示符中执行一些过多的工作.您需要调整〜/ .bashrc或〜/ .login以使更改成为永久更改.仍然,6秒钟的"ls"是疯狂的慢,所以你的机器还有一些问题.我建议您使用Windows框中的某些SysInternals工具来查看正在打开的文件.http://technet.microsoft.com/en-us/sysinternals/default (2认同)

小智 79

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

#export PATH="$HOME/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

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

  • 非常感谢,同样的问题,但是我通过创建一个名为HOME的(用户)环境变量来修复它,指向我想要的主目录.如果$ HOME不存在,显然git bash将默认为%USERPROFILE%.在此之后,git bash闪电般快速. (14认同)
  • 这在很大程度上解决了我的问题,但至少从2.7.2开始,我发现在/etc/profile.d/env.sh中导出而不是直接在/ etc/profile文件中导出. (9认同)
  • 我遇到过同样的问题.我改变了`HOME ="$(cd"$ HOME"; pwd)"`到`HOME ="$(cd"$ USERPROFILE"; pwd)"`,现在一切都非常快.谢谢你的提示. (6认同)
  • 唯一有效的选择是评论中描述的@JHH.添加名为HOME的Windows用户环境变量,并定义所需的主目录.(控制面板 - >系统 - >高级系统设置 - >环境变量) (5认同)
  • 我成功使用了这个变体:在配置文件中,强制$ HOME到$ USERPROFILE,删除$ HOMEDRIVE引用.同样在Git Bash快捷方式的属性上,将"Start In"设置为%USERPROFILE% (2认同)
  • 跟进@JHH 的评论,HOME 环境变量需要是 Windows 路径,而不是我系统上的 Unix 样式路径。 (2认同)

小智 38

我发现网络驱动器是性能问题.HOME指的是一个缓慢的网络份额.我无法覆盖,HOMEDRIVE但这不是我所看到的问题.

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

HOME=%USERPROFILE%
Run Code Online (Sandbox Code Playgroud)

  • 这很有效.对于每个有网络问题的人来说,这都是真正的解决方案.您不必编辑任何配置文件,只需将HOME指向它应该的位置即可. (3认同)
  • 将 Env User Var HOME 定义为 %USERPROFILE% 不起作用。我定义了 SYSTEM VAR : HOME=C:\Users\myUserName (2认同)

Wil*_*ert 22

在对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\]
$ '
Run Code Online (Sandbox Code Playgroud)

这保留了彩色外壳的优点并显示当前分支名称(如果在Git存储库中),但在我的机器上显着更快,从0.75秒到0.1秒.

这是基于这篇博客文章.

  • 原始的`__git_ps1`包含状态信息,而不仅仅是分支名称.例如,如果你处于一个独立的头状态,在git目录中,在一个裸仓库中,在樱桃采摘或变基或合并的过程中......这会更快,但有时候你可能会错过这个额外的信息,特别是作为Git初学者. (2认同)

Jef*_*amb 22

虽然您的问题可能是基于网络的,但我个人git status通过两次修改加速了我的本地调用十倍(7秒以上至700毫秒).这是一个700 MB的存储库,包含21,000个文件和大量的大型二进制文件.

一个是启用并行索引预加载.从命令提示符:

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中将"start"键更改HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/luafv为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中速度问题正在进行的其他工作.

  • 我记得在68年使用git,这是光荣的. (20认同)
  • 这只会让人们再次看到idiotics和meandrous微软的解决方案,以便在1968年以简单而优雅的方式解决Unix中出现的问题.微软的膨胀和缺乏重构/灵活性浪费了多少生产力,时间和金钱大胆的全球? (9认同)
  • 哈哈离开@CharlieBrown一年前哈哈 (2认同)

Gem*_*i14 17

似乎完全卸载Git,重新启动(经典的Windows固化),并重新安装Git是治愈.我还清除了剩下的所有bash配置文件(它们是手动创建的).一切都很快.

如果由于某种原因重新安装是不可能的(或者是可取的),那么我肯定会尝试更改Chris Dolan的答案中引用的PS1变量; 它导致某些操作的显着加速.

  • 重新安装而不重启不起作用,uninstall-restart-install工作正常.谢谢!不过要知道为什么以及bash如此缓慢,这将是一件好事. (3认同)
  • 你确切消灭了哪些bash配置文件? (3认同)
  • 这不是答案的解决方案.当您卸载并重新安装某些配置文件可能已更改时,这些更改就是答案.如果您只是说重新安装是解决方案,那就错了.其他人可能会卸载并重新安装和配置文件可能是相同的,这就是为什么它不适合每个人. (3认同)

小智 10

我通过使用"以管理员身份运行"启动cmd.exe解决了Windows 7 x64上的慢速Git问题.

  • 这个问题讨论了git bash. (9认同)
  • 哇,以管理员身份运行git bash的巨大速度提升 (3认同)
  • 你可以以管理员身份运行git bash; 这似乎表明UAC问题 (2认同)
  • @ vinoth10好吧,以管理员身份运行存在问题。出于多种原因,这是一个坏主意,对于许多公司用例来说,这根本不是一个选择。通过提升用户来解决性能问题是一个可怕的解决方案。 (2认同)

And*_*ndy 8

通过将core.preloadindex设置为true,我看到了一个不错的改进.


Ale*_*mov 6

只有在设备管理器中关闭 AMD Radeon Graphics(或 Intel Graphics)对我有帮助。

在此输入图像描述

我在这里找到了答案: https://superuser.com/questions/1160349/git-is-extremely-slow-on-windows# =


sin*_*law 5

正如Chris Dolan和Wilbert的回答所指出的那样,PS1会减慢你的速度.

而不是完全禁用(如Dolan建议)或使用Wilbert提供的脚本,我使用更快的"哑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\]# '
Run Code Online (Sandbox Code Playgroud)

在我的Cygwin上,这比Wilbert的"fast_Git_PS1"答案要快- 200毫秒与400毫秒,所以它会减少你的一点点迟钝.

它没有那么复杂__git_ps1- 例如,当你进入.git目录等时它不会改变提示,但是对于正常的日常使用它是足够好和快速的.

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


Nko*_*ean 5

我在Git Bash和Git GUI中遇到了同样的问题.两个程序都运行得很好,但随后他们随机慢下来爬行,我无法弄清楚原因.

事实证明,这是Avast.Avast导致各种程序(包括我编写的程序)发生了奇怪的事情,所以我禁用了一秒钟,果然,Bash现在运行速度和Linux一样快.我刚刚将Git程序文件文件夹(C:\Program Files\Git)添加到Avast排除列表中,现在它的运行速度与在Linux上的运行速度一样快.

是的,我知道防病毒软件不是原帖中的问题,但我会把它放在这里,以防它对某人有用.


Oli*_*ier 5

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

git config --global status.submoduleSummary false
Run Code Online (Sandbox Code Playgroud)

git status在Windows 7 x64上运行简单命令时,我的计算机花了30多秒钟才能运行。定义此选项后,命令立即生效。

如下页所述,激活Git自身的跟踪功能有助于我发现问题的根源,在您的安装中可能有所不同:https : //github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-慢


cod*_*rts 5

除了这些其他答案之外,我还通过使用并行子模块获取(自 2016 年初的 Git 2.8 以来)加速了具有多个子模块的项目。

这可以使用 完成git fetch --recurse-submodules -j8并设置git config --global submodule.fetchJobs 8,或者您拥有/想要使用的内核数量。