Git Bash在Windows 7 x64上非常慢

在一个小项目的开发过程中,我一直在Windows和Ubuntu上使用Git,经常在两者之间来回切换。问题是Git Bash始终变慢。

当我说慢的时候,我的意思是运行cd需要8-25秒,运行git命令需要5-20秒,而ls有时可能需要30秒。不用说,这一点都不好玩,更不用说没有成效了。我知道Git在Windows上比较慢,但这太荒谬了。

对我来说,一个暂时有效的解决方案是禁用我的网络连接(如这个答案中建议的那样),启动Git Bash,然后重新连接。有时在这样做之后,它会持续快速运行几天,但性能最终总是会下降。我已经在msysgit讨论组,Stack Overflow, msysgit问题列表等上拖了几周,但我还没能找到工作的解决方案。

到目前为止,我尝试过:

  • 添加Git &将项目文件夹转移到病毒扫描程序的排除列表
  • 完全禁用我的病毒扫描程序(卡巴斯基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个文件。

193329 次浏览

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

export PS1='$'

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

如果由于某种原因重新安装是不可能的(或可取的),那么我肯定会尝试更改克里斯·多兰的回答中引用的PS1变量;它导致了某些操作的显著加速。

我的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

我在Windows 7 x64上用“以管理员身份运行”启动cmd.exe,解决了Git速度慢的问题。

在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\]
$ '

这保留了彩色外壳和显示当前分支名称的好处(如果在Git存储库中),但是在我的机器上速度要快得多,从0.75秒到0.1秒。

这是基于这篇博文

我在Windows 7 x64上以有限用户帐户运行Git for Windows (msysgit)时也遇到过同样的问题。

从我在这里和其他地方读到的内容来看,共同的主题似乎是缺乏管理特权和/或UAC。由于UAC在我的系统上是关闭的,所以它试图写入/删除程序文件目录中的某些内容的解释对我来说最有意义。

无论如何,我已经通过安装带有zipinstaller的便携版Git 1.8解决了这个问题。请注意,我必须解压缩.7z分发文件,并将其重新打包为ZIP文件,以便让zipinstaller工作。我还必须手动将该目录添加到系统路径中。

现在演出很好。尽管它安装在Program Files (x86)目录中,作为有限用户,我没有权限,但它似乎没有同样的问题。

我认为这可能是因为便携版在写入/删除文件方面更加保守,也可能是因为从1.7升级到1.8。我不打算确定哪一个是原因,我只想说它现在工作得更好了,包括Bash。

通过设置核心,我看到了一个不错的改善。preloadindex to 如此处推荐的为True

正如克里斯·多兰和威尔伯特的回答所指出的,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\]# '

在我的Cygwin上,这比Wilbert的“fast_Git_PS1”回答快- 200毫秒对400毫秒,所以它剃掉了你的提示迟钝。

它不像__git_ps1那么复杂——例如,当你cd到.git目录时,它不会改变提示符,等等,但对于日常使用来说,它足够好和快速。

这是在Git 1.7.9 (Cygwin,但它应该可以在任何平台上工作)上测试的。

虽然你的问题可能是基于网络的,但我个人已经通过做两个修改将本地git status调用速度提高了十倍(7+秒降至700 ms)。这是在一个700mb的存储库上,有21,000个文件和过多的大二进制文件。

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

< p > git config core.preloadindex true
这将time git status从7秒更改为2.5秒。

更新!

以下内容不再必要。一个补丁已经修复了这个mysysgit 1.9.4
https://github.com/msysgit/git/commit/64d63240762df22e92b287b145d75a0d68a66988 < br > 但是,您必须通过输入
来启用修复 git config core.fscache true < / p >

我还禁用了UAC和“luafv”驱动程序(需要重新启动)。这将禁止windows和Vista 7和8中的驱动程序重定向试图写入系统位置的程序,而是将这些访问重定向到用户目录。

要查看关于这如何影响Git性能的讨论,请阅读这里: https://code.google.com/p/msysgit/issues/detail?id=320 < / p >

要禁用此驱动程序,在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中正在进行的关于速度问题的额外工作。

你可以通过运行三个命令来设置一些配置选项来显著提高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/中的文件数量

我发现网络驱动器是性能问题。HOME指向一个缓慢的网络共享。 我无法覆盖HOMEDRIVE,但从我所看到的来看,这不是一个问题

单击右键设置环境变量 >属性——>高级系统设置——>环境变量 添加到用户变量节

HOME=%USERPROFILE%

我也有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行与git当前分支和颜色,它工作正常。再次使用快速的Git命令行。

我在Git Bash和Git GUI中都遇到了同样的问题。这两个程序以前都运行得很好,但后来它们突然慢了下来,我不知道为什么。

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

是的,我意识到杀毒软件不是最初帖子中的问题,但我只是把它放在这里,以防它对某人有用。

在我的例子中,Git Bash快捷方式被设置为Start in:%HOMEDRIVE%%HOMEPATH%(你可以通过右键单击Git Bash并选择属性来检查这一点)。这是网络驱动器。

解决方法是让它指向%HOME%。如果您没有,您可以在环境变量中设置它,现在Git Bash应该是闪电般的快。

我的一个同事在Windows(7)上使用Git时遇到了问题,git status checkoutadd速度很快,但git commit需要很长时间。

我们仍在试图找到这个问题的根本原因,但克隆存储库到一个新文件夹解决了他的问题。

如果你从cmd中使用Git,尝试从Git Bash中运行它。 在cmd中,git.exe实际上是一个包装器,每次启动它时都会设置正确的环境,然后才启动真正的git.exe。做你想做的事情所需要的时间可能是实际时间的两倍。Git Bash只在启动时设置环境

在我的例子中,它实际上是Avast防病毒软件,导致Git Bash甚至PowerShell变得非常缓慢。

我首先尝试禁用Avast 10分钟,看看它是否提高了速度,结果确实如此。之后,我在Avast中添加了整个Git Bash安装目录作为一个例外,用于读、写和执行。在我的例子中,它是C:\Program Files\Git\*

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

git config --global status.submoduleSummary false

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

激活Git自己的跟踪,如下页所述,帮助我找到了问题的根源,这可能与您的安装不同: https://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-slow < / p >

结合回答:

  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://stackoverflow.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/19500237#19500237
# https://stackoverflow.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/13476961#13476961
# https://stackoverflow.com/questions/39518124/check-if-directory-is-git-repository-without-having-to-cd-into-it/39518382#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}\] $ '

结果:

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

以上这些都不能帮助我。在我的场景中,问题是这样表现的:

  • 任何ll命令都很慢(执行大约需要3秒)
  • 任何随后的ll命令被立即执行,但前提是在上一个ls命令的45秒内. c。

当使用过程监控调试时,发现在每个命令之前都有一个DNS请求。

因此,只要我禁用防火墙(在我的情况下是Comodo)并让命令执行,问题就消失了。当防火墙重新打开时,它不会返回。有了最早的机会,我将更新这个响应,提供有关哪个进程正在阻塞DNS请求以及目标是什么的更多详细信息。

BR, G

只有在设备管理器中关闭AMD Radeon显卡(或英特尔显卡)对我有帮助。

enter image description here

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

除了这些其他的答案,我还通过使用并行子模块抓取(从2016年初的Git 2.8开始)来加速多子模块的项目。

这可以用git fetch --recurse-submodules -j8来完成,用git config --global submodule.fetchJobs 8来设置,或者不管你有/想要使用多少个内核。

正如许多人所说,这是由于stash是Windows上的shell脚本,但从Git 2.18.0开始,Windows安装程序就有了一个更快(~90%)内置版本stash -的实验特性选项 https://github.com/git-for-windows/build-extra/pull/203 . < / p >

我也有过类似的情况,我的问题与活动目录有关,坐在vpn后面。

这样工作了半年后发现了这个金子:http://bjg.io/guide/cygwin-ad/

你所需要做的就是从passwdgroup部分禁用/etc/nsswitch.conf中的db(你可以在你的git目录中找到它),这样文件看起来就像:

# 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