在Windows上正常使用git(例如git push
和git pull
)时,它有时会很慢。一次又一次地运行git pull
会在大多数时间内在两秒内返回,但大约1/6的尝试大约需要一分钟。
我已将git config --global core.preloadindex
和git 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次测试),与以前一样。
答案 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)。
禁用绑定日志记录修复我的问题和速度恢复正常。