在一个小项目的开发过程中,我一直在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上的Git速度:

git config --global core.preloadindex true
git config --global core.fscache true
git config --global gc.auto 256

注:

核心。preloadindex并行执行文件系统操作以隐藏延迟(更新:在Git 2.1中默认启用) 核心。fscache修复了UAC问题,所以你不需要以管理员身份运行Git(更新:在Git for Windows 2.8中默认启用) gc。Auto最小化.git/中的文件数量

其他回答

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

git config --global status.submoduleSummary false

在windows 7 x64上运行简单的git status命令时,我的电脑花了30多秒才运行完。定义此选项后,命令立即生效。

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

通过设置核心,我看到了一个不错的改善。按照这里的建议,Preloadindex设为true。

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

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

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

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

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

结合回答:

威尔伯特- PS1中应该包含哪些信息 Sinelaw 's - (<branch_name>) or (<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}\] $ '

结果:

在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秒。

这是基于这篇博客文章。