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


当前回答

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

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

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

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

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

其他回答

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

如果出于某种原因,重新安装是不可能的(或不可取的),那么我肯定会尝试改变Chris Dolan回答中提到的PS1变量;它导致了某些操作的显著加速。

我的一个同事在Windows(7)上使用Git时遇到了麻烦,Git状态检查和添加都很快,但是Git提交却花了很长时间。

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

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

export PS1='$'

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

任何ls -l命令都很慢(大约需要3秒才能执行) 任何后续的ls -l命令都会立即执行,但前提是在前一个ls命令的45秒内。

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

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

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

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

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