Git Bash在Windows 7 x64上非常慢


435

在一个小项目的开发过程中,我一直在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
不要气to,但是Cygwin在x64上速度非常慢,最好在Windows XP 32bit上尝试。
ismail 2010年


5
在同一系统上,半年前速度并不慢。他们一定是改变的东西......
恢复莫妮卡-托马什Zato

2
在这里的几乎所有计算机上:卡巴斯基AV大大降低了git的速度,并且 “禁用”了卡巴斯基已损坏,avp.exe完全退出后仍在运行。完全重新安装卡巴斯基通常可以解决后一个问题。
peterchen 2014年

2
请参阅以下内容的msysgit Wiki页面:github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-slow
Drew Noakes

Answers:


409

您可以通过运行三个命令来设置一些配置选项,从而大大提高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(更新:在Windows 2.8的Git中默认启用)

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


并没有帮助我,但帮助了下面提到的出口PS1 ='$'。所以我知道问题出在终端线。
Koshmaar'2

67
2017年完全没用的设置(git 2.12),因为所有这些东西都是默认启用的。但是git仍然像狗屎一样缓慢运行。
ieXcept

2
在Windows 10上也很好用。做得好&感谢您使用此@shoelzer!

1
将文件限制为256个可能会导致一些问题。并且前两个选项已在新版本的git上启用。
nPcomp

@sonyvizio是什么问题?
shoelzer

102

您的Bash提示中是否显示Git信息?如果是这样,可能是您无意间对每个命令做了太多的工作。为了验证这一理论,请尝试以下Bash临时更改:

export PS1='$'

11
问题在于$(__git_ps1)...删除它会使一切变得超快
Hendy Irawan 2015年

10
对于我们中间的人来说,此命令的作用是什么?您说它是“临时的”,我们如何还原命令?
不朽之蓝

5
还解决了我的性能问题。要永久修复,请编辑C:\Program Files (x86\Git\etc\profile并将__git_ps1添加到的if-then-else注释掉PS1
汤姆(Tom)

6
在当前版本2.18.0中,我无法在/ etc / profile中找到__git_ps1命令。它移动到其他地方了吗?
keinabel '18

8
它似乎已移至C:\ Program Files \ Git \ etc \ profile.d \ git-prompt.sh。我注释掉了该文件中的__git_ps1,它运行得更快(但在提示符下丢失了分支信息)
Miyagi

85

我的Windows主目录位于网络上,我怀疑Git Bash命令首先在该目录中查找。果然,当我查看时$PATH,它/h/bin首先列出/h了Windows文件服务器上的共享,即使该共享/h/bin不存在。
我编辑/etc/profile并注释了将其放在第一位的export命令$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)",现在一切都很快。谢谢你的提示。
乔恩·萨加拉

2
我成功使用了这种变化:在配置文件中,将$ HOME强制为$ USERPROFILE,删除$ HOMEDRIVE引用。同样在Git Bash快捷方式的属性上,将“开始于”设置为%USERPROFILE%
Aidan Ryan

11
这在大多数情况下解决了我的问题,但是至少从2.7.2开始使用Git,我发现导出在/etc/profile.d/env.sh中而不是直接在/ etc / profile文件中。
Jared Siirila '16

15
非常感谢我,同样的问题,但是我通过创建一个名为HOME的(用户)环境变量来解决它,该变量指向我想要的主目录。如果$ HOME不存在,显然git bash将默认为%USERPROFILE%。在此之后,git bash快如闪电。
JHH 2016年

6
唯一起作用的选项是注释中描述的@JHH。添加一个名为HOME的Windows用户环境变量,并定义所需的主目录。(控制面板->系统->高级系统设置->环境变量)
RenRen

45

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

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

HOME=%USERPROFILE%

4
这工作了。对于每个遇到网络问题的人,这都是真正的解决方案。您不必编辑任何配置文件,只需将HOME指向应有的位置即可。
卡洛斯·卡拉

1
将Env用户Var HOME定义为%USERPROFILE%无效。我定义了系统变量:HOME = C:\ Users \ myUserName
colin_froggatt

为我工作!谢谢。我不喜欢的东西@colin_froggatt但在用户环境变量来代替,设置HOME = C:\用户\ MyUserName输入
d ..

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

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

这是基于此博客文章


好答案。但是,我决定在〜/ .bashrc中重新定义'__git_ps1()',然后只打印空字符串。它加快了所有Bash命令的速度。
ajukraine 2013年

我是git初学者,我想知道这个fast_git_ps1和原始的非常复杂的__git_ps1之间的区别。我知道这将适用于大多数“正常”情况,但是什么是正常的,这将在哪里失败?
sundar-恢复莫妮卡

我不知道它将失败的情况。我之前曾经使用过__git_ps1,但是注意到了性能问题,所以我不停地尝试使git减少提取显示信息的工作。
威伯特

2
原始__git_ps1信息包括状态信息,而不仅仅是分支名称。例如,如果您处于分离状态,则在git dir中,在裸仓库中,在进行樱桃采摘,变基或合并的过程中……这会更快,但是有时您会错过这些额外的信息,特别是作为Git初学者。
德鲁·诺阿克斯

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中将“开始”键更改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速度问题方面的其他工作。


10
这再一次暴露了笨拙的微软解决方案,以及愚蠢的微软解决方案,以1968年以简单而优雅的方式解决了Unix中解决的问题。微软的膨胀和缺乏重构/灵活性/浪费了很多生产工作,时间和金钱。世界范围的大胆?
v.oddou

20
我记得在68时使用过git,这非常出色。
查理·布朗

2
哈娜一年前Linus来@CharlieBrown
cchamberlain


18

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

如果由于某种原因无法(或不希望)重新安装,那么我肯定会尝试更改Chris Dolan的答案中引用的PS1变量;它导致某些操作的速度大大提高。


3
不重新启动而不重新安装无法正常工作,卸载-重新启动-安装有效。谢谢!不过,很高兴知道bash为何如此缓慢以及为何如此缓慢。
Gauthier

在两次重新启动之间重新安装对我来说没有任何区别。
RyanW 2011年

@RyanW恐怕我无法解决上面对我有用的解决方案,但是由于此问题似乎尚未永久解决,因此您可能想与msysgit的维护者联系,看看他们是否可以解决找出造成此问题的原因。
Gemini14 2011年

3
您完全抹掉了哪些bash配置文件?
斯科特(Scott)

3
这不是答案的解决方案。卸载并重新安装后,某些配置文件可能已更改,这些更改就是答案。如果仅说重新安装是解决方案,那是错误的。其他人可能会卸载并重新安装,并且配置文件可能相同,这就是为什么它不适用于所有人的原因。
卡洛斯·卡拉

10

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


10
这个问题是关于git bash的。
manojlds

2
您可以以管理员身份运行git bash;这似乎表明存在UAC问题
krosenvold

3
哇,以管理员身份运行git bash极大地提高了速度
Evil E

我不确定为什么这个答案只有6票。我认为这个答案完全解决了问题。速度有了很大的提高。
vinoth10 '18

2
@ vinoth10好吧,以管理员身份运行存在问题。出于多种原因,这是一个坏主意,对于许多公司用例来说,这根本不是一个选择。通过提升用户来解决性能问题是一个可怕的解决方案。
JHH


6

正如克里斯·多兰(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\]# '

在我的Cygwin上,这比Wilbert的“ fast_Git_PS1”答案要快-200毫秒对400毫秒,因此可以省去一些提示性的迟钝现象。

它不像它那么复杂__git_ps1-例如,当您进入cd目录时,它不会更改提示,等等。但是对于正常的日常使用来说,它足够好且快速。

已在Git 1.7.9(Cygwin,但它可以在任何平台上运行)上进行了测试。


您还可以使用--short不打印的选项refs/heads/
friederbluemle 2013年

@friederbluemle,您正在使用哪个版本的git?我的(1.7.9)不提供--shortsymbolic-ref命令。
sinelaw 2013年

已更新为在任何git repo外部均不打印错误,并且可用于分离的HEAD
sinelaw 2013年

我正在使用1.8.4(msysgit)
friederbluemle 13-10-24

6

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

git config --global status.submoduleSummary false

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

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


5

我在Git Bash和Git GUI中都遇到了同样的问题。这两个程序过去都可以很好地运行,但是随后它们随机减速以进行爬网,我不知道为什么。

事实证明,它是Avast。Avast导致各种程序(包括我编写的程序)发生奇怪的事情,因此我禁用了它一秒钟,而且可以肯定的是,Bash现在的运行速度与Linux上的运行速度相同。我刚刚将Git程序文件文件夹(C:\Program Files\Git)添加到Avast排除列表中,现在它的运行速度与Linux上的运行速度相同。

是的,我意识到防病毒软件不是原始帖子中的问题,但是我只是将其放在此处,以防它对某人有用。


4

除了这些其他答案外,我还使用并行子模块访存加快了具有多个子模块的项目(自2016年初的Git 2.8起)。

可以使用进行git fetch --recurse-submodules -j8设置,也可以使用设置git config --global submodule.fetchJobs 8,或者使用/想要使用许多内核。


2

如果您从cmd使用Git,请尝试从Git Bash运行它。在cmd中,git.exe实际上是一个包装程序,它每次启动时都会设置正确的环境,然后才启动真正的git.exe。做您想做的事情最多需要花费两倍的时间。而且,Git Bash仅在启动时设置环境。



2

综合答案:

  1. 威尔伯特-PS1中包含哪些信息
  2. sinelaw的 - (<branch_name>)(<sha>)
# /unix/140610/using-variables-to-store-terminal-color-codes-for-ps1/140618#140618
# /unix/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")"

# /programming/4485059/git-bash-is-extremely-slow-in-windows-7-x64/19500237#19500237
# /programming/4485059/git-bash-is-extremely-slow-in-windows-7-x64/13476961#13476961
# /programming/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)$


并没有使其更快
keinabel


2

我遇到了同样的问题,在Windows 7 x64上以受限用户帐户运行Windows版Git(msysgit)已有相当一段时间。

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

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

现在的表现还不错。即使它安装在Program Files (x86)目录中(我没有受限用户的权限),它似乎也不会遇到相同的问题。

我将其归因于以下事实:便携式版本在写入/删除文件时可能较为保守,或者是从1.7升级到1.8。我不会试图确定原因是什么,足以说它现在更好,包括Bash。


1
关闭UAC似乎可以为我们解决问题的“大”部分(几秒钟的延迟)。ps1 hack完成了其余的工作。
krosenvold13年

我在SSD,32GB RAM和四核i7上都一样,其他答案均
无济于事

2

就我而言,实际上是Avast防病毒软件导致Git Bash甚至PowerShell变得非常慢。

我首先尝试禁用Avast 10分钟,以查看它是否提高了速度,是否确实如此。之后,我将整个Git Bash安装目录添加为Avast中的例外,用于读取,写入和执行。就我而言C:\Program Files\Git\*


我想确认这个技巧。从Avast中排除git确实会使事情变得更快。我看到了git status而不再等待。赢得7 x64
fajarhac

杀毒软件只会干扰。
Alex78191

1
谢谢,这绝对是一个捷径!禁用了10分钟,发现git性能立即发生变化(即恢复到正常执行时间)。
Marcello Romani

这个解决方案对我有用。McAfee + Windows 10 Ent。
FractalSpace

1

以上没有任何帮助。在我的场景中,问题显示为:

  • 任何ll命令都很慢(执行大约需要3秒钟)
  • 任何后续ll命令都会立即执行,但前提是距上一个ls命令不超过45秒

在使用Process Monitor进行调试时,发现在每个命令之前都有一个DNS请求。

因此,一旦我禁用了防火墙(以我的情况为Comodo)并让命令执行,问题就消失了。重新打开防火墙后,它不会返回。尽早的机会,我将使用有关阻止DNS请求的进程以及目标进程的更多详细信息来更新此响应。

BR,G


ll作为别名log?似乎有DNS请求这样做很奇怪。
Michael-Clay Shirky在哪里,

1
ll是的别名ls -l。无论如何,触发DNS请求仍然很奇怪...同时,我仍在等待该问题再次出现,以将更多详细信息添加到回复中。
乔治,

1

就我而言,Git Bash快捷方式设置为 Start in:%HOMEDRIVE%%HOMEPATH%(您可以通过右键单击Git Bash并选择属性来进行检查)。这是网络驱动器。

解决方案是使其指向%HOME%。如果没有它,可以在环境变量中进行设置,现在Git Bash应该很快就可以了。


我认为这个答案应该有更多的选票。我来这里发表同样的建议,但是看到你已经击败了我。
乔恩(Jon)

0

我也遇到了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
    ...

从堆栈溢出后PS1行使用git current分支和颜色,它可以正常工作。再次使用快速的Git命令行。


那么您的问题是由您编写的脚本引起的吗?对于其他搜索相同问题的用户来说,可能不是该脚本引起问题的原因
Jolta

看一下OP的问题-他提到了他检查过的很多内容,但事实并非如此。我也一样。因此,在这里我添加了另一件事,那就是没有任何帮助。重要的不是我写的这个特定脚本,而是一个概念-查看您的PS1。
Koshmaar '16

0

我的一位同事曾与Git的烦恼在Windows(7)git status checkoutadd为快,但git commit花了很长时间。

我们仍在尝试寻找导致此问题的根本原因,但是将存储库克隆到新文件夹中解决了他的问题。


0

正如许多人所说,这是由于stash它是Windows上的shell脚本,但是自Git 2.18.0起,Windows安装程序可以选择具有更快(〜90%)内置存储版本的实验功能-https :/ /github.com/git-for-windows/build-extra/pull/203


这对stash有所帮助,但您的内容是stash专门提及的第一篇文章。它会影响其他Git操作吗?
Michael-Clay Shirky在哪里,

据我了解,没有。预览中有2个实验性功能,这些功能允许拥有stash和/或rebase使用本机可执行文件以获得更好的性能,但预览中的任何内容始终很少会产生小的副作用。
bergmeister

1
PS此功能在
2.19.1版中已过
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.