Git pull随机挂起

时间:2017-02-27 13:24:23

标签: windows git git-pull

在Windows上正常使用git(例如git pushgit pull)时,它有时会很慢。一次又一次地运行git pull会在大多数时间内在两秒内返回,但大约1/6的尝试大约需要一分钟。

我已将git config --global core.preloadindexgit config --global core.fscache设为true。

运行set GIT_TRACE=1

后的示例

慢速:

$ git pull
14:11:03.166594 git.c:371               trace: built-in: git 'pull'
14:11:03.168594 run-command.c:350       trace: run_command: 'fetch' '--update-head-ok'
14:11:03.186596 git.c:371               trace: built-in: git 'fetch' '--update-head-ok'
14:11:03.189596 run-command.c:350       trace: run_command: 'git-remote-https' 'origin' 'https://[...].git'
14:11:03.204598 run-command.c:350       trace: run_command: 'git credential-manager get'
14:11:46.400917 git.c:607               trace: exec: 'git-credential-manager' 'get'
14:11:46.400917 run-command.c:350       trace: run_command: 'git-credential-manager' 'get'
14:11:47.828059 run-command.c:350       trace: run_command: 'git credential-manager store'
14:11:47.869064 git.c:607               trace: exec: 'git-credential-manager' 'store'
14:11:47.869064 run-command.c:350       trace: run_command: 'git-credential-manager' 'store'
14:11:47.980075 run-command.c:350       trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
14:11:47.991076 run-command.c:350       trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
14:11:47.999077 git.c:371               trace: built-in: git 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
14:11:48.005077 run-command.c:1130      run_processes_parallel: preparing to run up to 1 tasks
14:11:48.005077 run-command.c:1162      run_processes_parallel: done
14:11:48.005077 run-command.c:350       trace: run_command: 'gc' '--auto'
14:11:48.014078 git.c:371               trace: built-in: git 'gc' '--auto'
14:11:48.017078 run-command.c:350       trace: run_command: 'merge' 'FETCH_HEAD'
14:11:48.025079 git.c:371               trace: built-in: git 'merge' 'FETCH_HEAD'
Already up-to-date.

快速:

$ git pull
14:12:25.432820 git.c:371               trace: built-in: git 'pull'
14:12:25.434820 run-command.c:350       trace: run_command: 'fetch' '--update-head-ok'
14:12:25.451821 git.c:371               trace: built-in: git 'fetch' '--update-head-ok'
14:12:25.454822 run-command.c:350       trace: run_command: 'git-remote-https' 'origin' 'https://[...].git'
14:12:25.472824 run-command.c:350       trace: run_command: 'git credential-manager get'
14:12:25.497826 git.c:607               trace: exec: 'git-credential-manager' 'get'
14:12:25.497826 run-command.c:350       trace: run_command: 'git-credential-manager' 'get'
14:12:26.904967 run-command.c:350       trace: run_command: 'git credential-manager store'
14:12:26.941970 git.c:607               trace: exec: 'git-credential-manager' 'store'
14:12:26.941970 run-command.c:350       trace: run_command: 'git-credential-manager' 'store'
14:12:27.050981 run-command.c:350       trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
14:12:27.060982 run-command.c:350       trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
14:12:27.068983 git.c:371               trace: built-in: git 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
14:12:27.074984 run-command.c:1130      run_processes_parallel: preparing to run up to 1 tasks
14:12:27.074984 run-command.c:1162      run_processes_parallel: done
14:12:27.074984 run-command.c:350       trace: run_command: 'gc' '--auto'
14:12:27.082985 git.c:371               trace: built-in: git 'gc' '--auto'
14:12:27.085985 run-command.c:350       trace: run_command: 'merge' 'FETCH_HEAD'
14:12:27.092986 git.c:371               trace: built-in: git 'merge' 'FETCH_HEAD'
Already up-to-date.

编辑:

运行git config --global credential.helper ""后,包含credential-manager的输出中的行将替换为:

17:18:44.139589 run-command.c:350       trace: run_command: 'bash' '-c' 'cat >/dev/tty && read -r -s line </dev/tty && echo "$line" && echo >/dev/tty'
Password for 'https://[...]':

有时会在显示密码行之前出现延迟,并且持续时间和频率相同(据我所知,大约20次测试),与以前一样。

3 个答案:

答案 0 :(得分:5)

根据您的跟踪,似乎验证步骤很慢。我可以看到两个主要原因:

  • 服务器有时响应缓慢。您将无法在客户端执行任何操作。
  • 身份验证方面有问题。我认为最可能的原因是你可能会使用导致速度缓慢的凭据管理器。尝试禁用它。

答案 1 :(得分:5)

请首选 ssh 而不是https。我假设您已经拥有GitBash,因此您可以关注this教程。确保将repo克隆到新目录中,这样就不会丢失当前的https设置和任何本地更改。

如果问题仍然存在,尽管很可能是网络问题,您可以考虑在此answer中显示的ssh调试。

答案 2 :(得分:3)

TL; DR - 我的慢速git(GCM)通过在我的机器上禁用.net程序集绑定来修复(通过fuslogvw)。

我发现这是由于缓慢的git凭据管理器(GCM)在跟踪模式下运行git和GCM:

$ SET GIT_TRACE=1 
$ SET GCM_TRACE=1
$ git fetch

日志显示GCM很慢。当使用sysinternals的进程监视器查看GCM以弄清楚发生了什么时,我看到它正在大量写入磁盘。

现在,事实证明GCM是一个.net进程,我已经配置了.net来记录所有程序集绑定到磁盘,以便在几天前调试某些进程(通过fuslogvw - fusion log viewer)。

禁用绑定日志记录修复我的问题和速度恢复正常。