Git натяжение зависает случайно
При использовании git для окон обычно (например, git push
и git pull
), это иногда будет очень медленным. Выполнение git pull
снова и снова возвращается в течение двух секунд большую часть времени, но около 1/6 попыток занимает около минуты.
Я установил git config --global core.preloadindex
и git config --global core.fscache
в true.
Примеры после запуска set GIT_TRACE=1
Slow:
$ 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.
Edit:
После запуска 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 тестов), как и раньше.
Ответы
Ответ 1
Основываясь на вашей трассе, кажется, что шаг аутентификации медленный. Я вижу две основные причины:
- Сервер иногда реагирует медленно. Вы не сможете ничего делать на стороне клиента.
- Что-то не так с проверкой подлинности на вашей стороне. Наиболее вероятная причина, по которой я думаю, заключается в том, что вы можете использовать диспетчер учетных данных, который вызывает медленность. Попытайтесь отключить его.
Ответ 2
Пожалуйста, предпочитайте ssh по https. Я предполагаю, что у вас уже есть GitBash, поэтому вы можете следовать этому учебнику. Убедитесь, что вы клонируете репо в новый каталог, чтобы не потерять текущую настройку https и любые локальные изменения.
Если проблема не устранена, хотя, скорее всего, это будет проблема с сетью, вы можете рассмотреть отладку ssh, указанную в этом .
Ответ 3
TL; DR - Мой медленный git (GCM) был исправлен, отключив привязку сборки .net на моей машине (через fuslogvw).
Я обнаружил, что это связано с медленным менеджером учетных данных git (GCM), запустив git и GCM в режиме трассировки:
$ SET GIT_TRACE=1
$ SET GCM_TRACE=1
$ git fetch
Журналы показали, что GCM был медленным. Когда я смотрел на GCM с помощью монитора процессов sysinternals, чтобы выяснить, что происходит, я увидел, что он сильно пишет на диск.
Теперь выяснилось, что GCM - это .net-процесс, и я настроил .net для регистрации всех сборок сборки на диск для отладки какого-то процесса пару дней назад (через fuslogvw - просмотр журнала слияния).
Отключение ведение журнала привязки устраняет мою проблему и скорость возвращается в нормальное состояние.