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


当前回答

虽然您的问题可能是基于网络的,但我个人通过做两个修改将本地git状态调用速度提高了十倍(7+秒降至700毫秒)。这是一个700 MB的存储库,包含21,000个文件和过多的大型二进制文件。

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

Git配置核心。preloadindex真实 这改变了时间git状态从7秒到2.5秒。

更新! 以下内容不再需要。从mysysgit 1.9.4开始,一个补丁已经修复了这个问题 https://github.com/msysgit/git/commit/64d63240762df22e92b287b145d75a0d68a66988 但是,必须通过键入来启用修复 Git配置核心。fscache真实

我还禁用了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”目录下的“start”键改为“4”即可禁用该驱动。然后,把UAC调到最低设置,“从不通知”。

如果禁用这个驱动程序使您感到谨慎(应该如此),那么另一个替代驱动程序正在与您的系统分区不同的驱动器(或分区)上运行。显然,驱动程序只在系统分区上的文件访问时运行。我有第二个硬盘驱动器,当我在C驱动器上运行这个注册表修改时,看到的结果与没有在D驱动器上运行时相同。

此更改将时间git状态从2.5秒降低到0.7秒。

你可能还想关注https://github.com/msysgit/git/pull/94和https://github.com/git/git/commit/d637d1b9a8fb765a8542e69bd2e04b3e229f663b,看看Windows中的速度问题正在进行哪些额外的工作。

其他回答

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

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

虽然您的问题可能是基于网络的,但我个人通过做两个修改将本地git状态调用速度提高了十倍(7+秒降至700毫秒)。这是一个700 MB的存储库,包含21,000个文件和过多的大型二进制文件。

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

Git配置核心。preloadindex真实 这改变了时间git状态从7秒到2.5秒。

更新! 以下内容不再需要。从mysysgit 1.9.4开始,一个补丁已经修复了这个问题 https://github.com/msysgit/git/commit/64d63240762df22e92b287b145d75a0d68a66988 但是,必须通过键入来启用修复 Git配置核心。fscache真实

我还禁用了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”目录下的“start”键改为“4”即可禁用该驱动。然后,把UAC调到最低设置,“从不通知”。

如果禁用这个驱动程序使您感到谨慎(应该如此),那么另一个替代驱动程序正在与您的系统分区不同的驱动器(或分区)上运行。显然,驱动程序只在系统分区上的文件访问时运行。我有第二个硬盘驱动器,当我在C驱动器上运行这个注册表修改时,看到的结果与没有在D驱动器上运行时相同。

此更改将时间git状态从2.5秒降低到0.7秒。

你可能还想关注https://github.com/msysgit/git/pull/94和https://github.com/git/git/commit/d637d1b9a8fb765a8542e69bd2e04b3e229f663b,看看Windows中的速度问题正在进行哪些额外的工作。

在Chris Dolan回答的扩展中,我使用了以下替代PS1设置。只需将代码片段添加到~/。配置文件(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秒。

这是基于这篇博客文章。

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

这可以用git fetch——recursive -submodules -j8和git config——global submodule来设置。fetchJobs 8,或者你有/想要使用的任何核。

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

这样工作了半年,找到了这个金子:http://bjg.io/guide/cygwin-ad/

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

# 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