456

在开发一个小项目的过程中,我一直在 Windows 和 Ubuntu 上使用 Git,经常在两者之间来回切换。问题是Git Bash一直变慢。

当我说慢时,我的意思是运行cd需要 8-25 秒,运行git命令需要 5-20 秒,ls有时可能需要 30 秒。不用说,这不好玩,更不用说没有生产力了。我知道 Git 在 Windows 上速度较慢,但​​这很荒谬。

对我来说暂时有效的一种解决方案是禁用我的网络连接(如this answer中所建议),启动Git Bash,然后重新连接。有时它会在执行此操作后继续快速运行数天,但最终性能总是会下降。我已经在 msysgit 讨论组、堆栈溢出、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 个文件。

4

24 回答 24

427

您可以通过运行三个命令来设置一些配置选项来显着加快 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(更新:在 Git for Windows 2.8 中默认启用)

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

于 2014-06-04T19:30:22.193 回答
109

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

export PS1='$'
于 2010-12-19T22:10:10.453 回答
93

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

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

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

于 2011-08-09T14:27:32.960 回答
53

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

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

HOME=%USERPROFILE%
于 2015-01-07T22:34:10.983 回答
26

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

这是基于这篇博文

于 2012-11-20T15:53:45.590 回答
23

虽然您的问题可能是基于网络的,但我个人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 中的速度问题正在进行的其他工作.

于 2014-03-05T20:47:50.137 回答
20

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

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

于 2010-12-22T04:37:12.543 回答
9

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

于 2011-10-28T01:04:42.057 回答
8

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

git config --global status.submoduleSummary false

在 Window 7 x64 上运行简单git status命令时,我的计算机运行时间超过 30 秒。定义此选项后,该命令立即生效。

按照以下页面中的说明激活 Git 自己的跟踪帮助我找到了问题的根源,这可能在您的安装中有所不同: https ://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-减缓

于 2016-12-01T16:36:57.200 回答
7

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

于 2013-08-17T10:49:04.240 回答
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 目录等时,它不会更改提示,但对于日常使用来说,它已经足够好且速度快了。

这是在 Git 1.7.9(Cygwin,但它应该可以在任何平台上工作)上测试的。

于 2013-10-21T16:46:12.547 回答
5

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

这可以通过 来完成git fetch --recurse-submodules -j8和设置git config --global submodule.fetchJobs 8,或者您拥有/想要使用的任何核心。

于 2018-06-15T15:27:04.317 回答
4

只有在设备管理器中关闭 AMD Radeon Graphics(或 Intel Graphics)对我有帮助。

在此处输入图像描述

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

于 2018-05-12T11:03:40.573 回答
4

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

事实证明,它是 Avast。Avast 导致各种程序(包括我编写的程序)发生奇怪的事情,所以我禁用了它一秒钟,果然,Bash 现在运行速度和它在 Linux 上一样快。我刚刚将 Git 程序文件文件夹 ( C:\Program Files\Git) 添加到 Avast 排除列表,现在它的运行速度与在 Linux 上一样快。

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

于 2016-04-05T04:49:23.633 回答
3

综合答案:

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

结果:

frolowr@RWAMW36650 /c/projects/elm-math-kids (master) $

于 2017-04-23T09:40:46.360 回答
3

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

解决办法是让它指向%HOME%. 如果你没有它,你可以在环境变量中设置它,现在 Git Bash 应该快如闪电了。

于 2016-05-12T09:00:00.340 回答
2

我在 Windows 7 x64 上作为受限用户帐户运行 Git for Windows (msysgit) 已经有一段时间了。

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

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

现在的表现很好。即使它安装在Program Files (x86)我没有权限作为受限用户的目录中,它似乎也没有遇到同样的问题。

我将此归因于便携式版本在写入/删除文件的位置更保守(可能是这种情况)或从 1.7 升级到 1.8 的事实。我不会试图确定是哪一个原因,我只想说它现在工作得更好,包括 Bash。

于 2012-12-19T04:24:44.563 回答
2

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

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

于 2016-07-21T23:09:39.990 回答
1

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

于 2016-07-19T08:57:16.900 回答
0

以上没有任何东西可以帮助我。在我的场景中,问题显示如下:

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

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

因此,一旦我禁用了防火墙(在我的情况下为 Comodo)并让命令执行,问题就消失了。当防火墙重新打开时,它不会返回。我将尽早更新此响应,详细说明哪个进程正在执行阻塞 DNS 请求以及目标是什么。

BR,G

于 2018-02-18T02:42:41.953 回答
0

我也遇到过类似的情况,我的问题与 Active Directory 有关,并且位于 vpn 后面。

就这么干了半年找到了这个金子:http: //bjg.io/guide/cygwin-ad/

您基本上需要的是从和部分禁用(您可以在您的 git 目录中找到它)db,因此文件如下所示:/etc/nsswitch.confpasswdgroup

# 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
于 2021-01-21T09:14:31.293 回答
0

我的一位同事在 Windows (7) 上遇到了 Git 问题,git status checkout速度add很快,但git commit花了很长时间。

我们仍在努力寻找造成这种情况的根本原因,但是将存储库克隆到一个新文件夹中解决了他的问题。

于 2016-05-24T12:37:15.387 回答
0

正如许多人所说,这是因为它stash是 Windows 上的一个 shell 脚本,但是从 Git 2.18.0 开始,Windows 安装程序可以选择一个实验性功能,即更快(约 90%)的内置存储版本 - https:/ /github.com/git-for-windows/build-extra/pull/203

于 2018-10-22T21:20:37.187 回答
-1

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

带有 git current branch 和颜色的 Stack Overflow post PS1 行,它工作正常。再次拥有一个快速的 Git 命令行。

于 2016-02-08T11:15:43.657 回答