Git / Bash在Windows 7 x64中速度非常慢

在一个小型项目的开发过程中,我一直在Windows和Ubuntu上使用Git,经常在两者之间来回翻转。 我遇到的问题是Git / Bash一直变慢。 当我说慢时,我的意思是运行cd需要8-25秒,运行git命令需要5-20秒,而ls最多可能需要30秒。 不用说,这不是好玩,更不用说没有生产力了。 我知道Git在Windows上比较慢,但是这很荒谬。

对我来说暂时的一个解决scheme就是禁用我的networking连接(如本答案中的build议),启动git,然后重新连接。 有时在这样做后的几天里,它会继续快速运行,但是性能总是最终降低。 我已经通过msysgit讨论组,SO,msysgit问题列表等等几个星期的开始和closures,但我一直无法打开解决scheme的工作。

到目前为止,我已经尝试过:

  • 将git&project文件夹添加到病毒扫描程序的排除列表中
  • 完全禁用我的病毒扫描程序(Kaspersky IS 2011)
  • 确保Outlook未运行(Outlook 2007)
  • closures所有其他应用程序
  • 以pipe理员身份运行git
  • 禁用networking连接,启动git,并禁用连接
  • 禁用networking连接,启动git,重新启用连接(偶尔工作)
  • 运行git gc
  • 以上的组合

我读过一些人已经成功禁用bash完成,但理想情况下我想保持活跃。 msysgit的版本是1.7.3.1-preview20101002&操作系统是Windows 7 x64。 在Linux上运行相同的东西,可以预见,闪电般快。 我会独占使用Linux,但是我也需要在Windows中运行东西(某些应用程序,testing等)。

有没有人遇到类似的问题? 如果是这样,底层的问题是什么,解决scheme是什么(如果有的话)?

编辑:这超出了只是git仓库,但仅供参考,我一直使用git的回购已经很小:最多4-50个文件。

你可以通过运行三个命令来设置一些configuration选项来显着加快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问题,所以你不需要以admin身份运行git(更新:在Git for Windows 2.8中默认启用)

  • gc.auto最大限度地减less.git /

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

 export PS1='$' 

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

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

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

虽然你的问题可能是基于networking的,但是我通过做两个修改,亲自加快了我的git status调用十倍(7+秒到700毫秒)。 这是一个700MB的回购与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中的驱动程序,以redirect试图写入系统位置的程序,而是将这些访问redirect到用户目录。

要查看关于如何影响git性能的讨论,请阅读以下链接: https : //code.google.com/p/msysgit/issues/detail?id=320

要禁用此驱动程序,请在registry编辑器中将HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/luafv上的“开始”键HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/luafv为4以禁用该驱动程序。 然后,将UAC置于最低设置“永不通知”。

如果禁用此驱动程序会引起警惕(应该),另一种方法是在与系统分区不同的驱动器(或分区)上运行。 显然,驱动程序只能在系统分区上的文件访问上运行。 我有第二个硬盘驱动器,并在我的C驱动器上运行此registry修改时看到相同的结果,因为我没有它在D驱动器上。

这个改变需要2.5秒的time git status下降到0.7秒。

您也可能想要遵循https://github.com/msysgit/git/pull/94和https://github.com/git/git/commit/d637d1b9a8fb765a8542e69bd2e04b3e229f663b查看在Windows中速度问题正在进行的其他工作。;

我发现networking驱动器是性能问题。 HOME指向一个缓慢的networking共享。 我不能重写HOMEDRIVE但这不是我所见过的问题。

右击桌面上的计算机设置环境variables – >属性 – >高级系统设置 – >环境variables添加到用户variables部分

 HOME=%USERPROFILE% 

在Chris Dolan的回答中,我使用了下面的替代PS1设置。 只需将代码片段添加到〜/ .profile(在Win7: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.75s到0.1s。

基于这个博客 。

看来,完全卸载Git,重新启动(经典的Windows固化),并重新安装Git是治愈。 我还清除了所有剩下的bashconfiguration文件(它们是手动创build的)。 一切都很快。

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

按照这里的build议,通过将core.preloadindex设置为true,我看到了不错的改进。

我通过以“以pipe理员身份运行”启动cmd.exe,解决了Win 7 x64上缓慢的git问题。

我知道这是旧的,但我有同样的问题,在Git Bash和Git Gui。 这两个程序运行良好,但随后他们随机放缓爬行,我不明白为什么。 事实certificate,这是Avast。 Avast引起了各种各样的程序(包括我写的程序)的奇怪事情,所以我禁用了一秒钟,果然,Bash的运行速度与Linux上一样快。 我只是将Git程序文件文件夹(C:\ Program Files \ Git)添加到Avast排除列表中,现在它的运行速度与Linux上的一样快。

是的,我意识到反病毒不是在原来的post中的问题,但我只是把这个在这里,以防万一有用的人。

正如克里斯·多兰和威尔伯特的答案所指出的那样, PS1让你失望

而不是完全禁用(正如Dolan所build议的那样)或者使用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”答案要快–200ms对400ms,所以它可以减less一些迟钝的提示。

它不像__git_ps1那么复杂 – 例如,当你进入.git目录等时,它不会改变提示,但是对于正常的日常使用来说,它已经足够快了。

testinggit 1.7.9(cygwin,但应该在任何平台上工作)

我已经遇到了相同的问题在Windows 7 x64上运行git for Windows(msysgit)作为一个有限的用户帐户相当一段时间。 从我在这里和其他地方看到的,共同的主题似乎是缺乏pipe理权限和/或UAC。 由于UAC在我的系统上是closures的,它正试图写/删除程序文件目录中的东西的解释对我来说是最有意义的。

无论如何,我已经解决了我的问题,通过安装zipinstaller的可移植版本的git 1.8。 请注意,我必须解压.7z分发文件,并将其重新打包为压缩文件,以便zipinstaller工作。 我也不得不手动添加该目录到我的系统path。

现在的performance很好。 即使它安装在程序文件(x86)目录,我没有作为有限的用户的权限,似乎并没有遭受同样的问题。 我认为这是因为便携式版本在写入/删除文件的位置上可能稍微保守一些,可能是这种情况,或者从1.7升级到1.8。 我不打算试图确定哪一个是原因,只要说现在好多了,包括bash。

通过更改以下gitconfiguration,您也可能获得非常频繁的性能提升:

 git config --global status.submoduleSummary false 

在Windows 7 x64上运行简单的git status命令时,我的电脑运行了超过30秒。 在这个选项被定义之后,命令是立即的。

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

综合答案:

  1. 威尔伯特 – 什么信息包括在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}\] $ ' 

结果:

在这里输入图像说明

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

在我的情况下,它实际上是Avast杀毒软件导致git bash,甚至Powershell变得非常慢。

我第一次尝试禁用Avast 10分钟,看看它是否提高了速度,它确实。 之后,我在Avast中添加了整个Git Bash安装目录作为例外,用于读取,写入和执行。 在我的情况下是C:\Program Files\Git\*

我也遇到了git PS1问题,尽pipe很长一段时间,我认为这是一个数据库大小的问题(大回购),并尝试各种git gc triks,并寻找其他原因,就像你一样。 但是,就我而言,问题是这样的:

 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状态都很慢。 哎哟。 这是我手写的东西。 我看到这个问题,当我尝试的时候

 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 ... 

从这个SO https://stackoverflow.com/a/11975827/2492808 ,它工作正常。 再次拥有快速的git命令行。

在我的情况下,git bash快捷方式被设置为Start in:%HOMEDRIVE%%HOMEPATH% (你可以通过右击git bash并select属性来检查这个)。 这是networking驱动器。

解决方法是使其指向%HOME% 。 如果你没有它,你可以在环境variables中设置它,现在git bash应该是闪电般的。

我真的很晚参加派对,我知道…

…但是:我的一个同事在windows上有git的麻烦(7) git status checkoutadd是很快的,但是git commit需要很长时间。

我们仍然试图find这个的根本原因,但克隆回购到一个新的文件夹解决了他的问题。 以为我会在这里添加它,以防其他人有同样的问题,仍然在寻找解决scheme。