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 - просмотр журнала слияния).

Отключение ведение журнала привязки устраняет мою проблему и скорость возвращается в нормальное состояние.