Как я могу отладить проблемы, связанные с git / git-shell? - PullRequest
121 голосов
/ 30 мая 2011

Как получить отладочную информацию, касающуюся git / git-shell?

У меня была проблема, что user1 мог клонировать репозиторий без проблем, в то время как user2 мог клонировать только пустой.Я установил GIT_TRACE=1, но ничего полезного не было сказано.

Наконец, после долгих проб и ошибок выяснилось, что это проблема с правами доступа к файлу.Соответствующее сообщение об ошибке может привести к короткому замыканию этой проблемы.

Ответы [ 7 ]

172 голосов
/ 27 июня 2013

Для еще более подробного вывода используйте следующее:

GIT_CURL_VERBOSE=1 GIT_TRACE=1 git pull origin master

58 голосов
/ 01 августа 2016

Отладка

В Git встроен довольно полный набор трассировок, которые вы можете использовать для отладки ваших проблем с git.

Чтобы включить их, вы можете определить следующие переменные:

  • GIT_TRACE для общих трассировок,
  • GIT_TRACE_PACK_ACCESS для трассировки доступа к пакетному файлу,
  • GIT_TRACE_PACKET для трассировки на уровне пакетов для сетевых операций,
  • GIT_TRACE_PERFORMANCE для регистрации данных о производительности,
  • GIT_TRACE_SETUP для получения информации об обнаружении хранилища и среды, с которой он взаимодействует,
  • GIT_MERGE_VERBOSITY для отладки стратегии рекурсивного слияния (значения: 0-5),
  • GIT_CURL_VERBOSE для регистрации всех сообщений curl (эквивалентно curl -v),
  • GIT_TRACE_SHALLOW для отладки извлечения / клонирования мелких репозиториев.

Возможные значения могут включать:

  • true, 1 или 2 для записи в stderr,
  • абсолютный путь, начинающийся с / для отслеживания выводак указанному файлу.

Подробнее см .: Git Internals- Переменные среды


SSH

Для проблем с SSH попробуйте следующие команды:

echo 'ssh -vvv "$*"' > ssh && chmod +x ssh
GIT_SSH="$PWD/ssh" git pull origin master

или используйте ssh для проверки ваших учетных данных,например,

ssh -vvvT git@github.com

или через порт HTTPS:

ssh -vvvT -p 443 git@ssh.github.com

Примечание. Уменьшите число -v, чтобы уменьшить уровень детализации.


Примеры

$ GIT_TRACE=1 git status
20:11:39.565701 git.c:350               trace: built-in: git 'status'

$ GIT_TRACE_PERFORMANCE=$PWD/gc.log git gc
Counting objects: 143760, done.
...
$ head gc.log 
20:12:37.214410 trace.c:420             performance: 0.090286000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:12:37.378101 trace.c:420             performance: 0.156971000 s: git command: 'git' 'reflog' 'expire' '--all'
...

$ GIT_TRACE_PACKET=true git pull origin master
20:16:53.062183 pkt-line.c:80           packet:        fetch< 93eb028c6b2f8b1d694d1173a4ddf32b48e371ce HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed symref=HEAD:refs/heads/master agent=git/2:2.6.5~update-ref-initial-update-1494-g76b680d
...
41 голосов
/ 10 декабря 2012

попробуйте это:

GIT_TRACE=1 git pull origin master
35 голосов
/ 26 января 2016

Если это через SSH, вы можете использовать следующее:

Для более высокого уровня отладки для типа -vv или -vvv для уровня отладки 2 и 3 соответственно:

# Debug level 1
GIT_SSH_COMMAND="ssh -v" git clone <repositoryurl>

# Debug level 2
GIT_SSH_COMMAND="ssh -vv" git clone <repositoryurl>

# Debug level 3
GIT_SSH_COMMAND="ssh -vvv" git clone <repositoryurl>

Этов основном полезно для решения проблем с открытым и закрытым ключом на сервере.Вы можете использовать эту команду для любой команды git, а не только для git clone.

17 голосов
/ 09 июля 2016

Git 2.9.x / 2.10 (3 квартал 2016 г.) добавляет еще один параметр отладки: GIT_TRACE_CURL.

См. коммит 73e57aa , коммит 74c682d (23 мая 2016 г.) от Элия Пинто (devzero2000) .
Помощник: Торстен Бёгерсхаузен (tboegi) , Рамсей Джонс, Джунио С Хамано (gitster) , Эрик Саншайн (sunshineco) , и Джефф Кинг (peff) .
(Объединено с Junio ​​C Hamano - gitster - in commit 2f84df2 , 06 Jul 2016)

http.c: реализовать переменную среды GIT_TRACE_CURL

Реализуйте переменную среды GIT_TRACE_CURL, чтобы обеспечить большую степень детализации GIT_CURL_VERBOSE, в частности полный заголовок транспорта и обмен всей полезной нагрузки данных.
Это может быть полезно, если конкретная ситуация может потребовать более тщательного анализа отладки.

В документации будет указано:

GIT_TRACE_CURL

Включает полный дамп трассировки всех входящих и исходящих данных, включая описательную информацию, транспортного протокола git.
Это похоже на выполнение curl --trace-ascii в командной строке.

Этот параметр переопределяет установку переменной среды GIT_CURL_VERBOSE.


Вы можете видеть, что новая опция используется в этом ответе , но также и в тестах Git 2.11 (Q4 2016):

См. коммит 14e2411 , коммит 81590bf , коммит 4527aa1 , коммит 4eee6c6 (07 сен 2016) от Элия Пинто (devzero2000) .
(Объединено с Junio ​​C Hamano - gitster - in commit 930b67e , 12 Sep 2016)

Вместо этого используйте новую переменную окружения GIT_TRACE_CURL устарел GIT_CURL_VERBOSE.

GIT_TRACE_CURL=true git clone --quiet $HTTPD_URL/smart/repo.git
4 голосов
/ 30 мая 2011

Пытались ли вы добавить подробный оператор (-v) при клонировании?

git clone -v git://git.kernel.org/pub/scm/.../linux-2.6 my2.6

1 голос
/ 12 мая 2019

Git 2.22 (Q2 2019) представляет trace2 с commit ee4512e by Джефф Хостетлер :

trace2: создать новое комбинированное средство трассировки

Создайте новое унифицированное средство трассировки для git.
Возможное намерение состоит в том, чтобы заменить текущие подпрограммы trace_printf* и trace_performance* унифицированным набором подпрограмм git_trace2*.

В дополнение к обычному API в стиле printf, trace2 обеспечивает более высокий уровень глаголы событий с фиксированными полями, позволяющими записывать структурированные данные.
Это облегчает постобработку и анализ для внешних инструментов.

Trace2 определяет 3 выходные цели.
Они устанавливаются с использованием переменных среды "GIT_TR2", "GIT_TR2_PERF" и "GIT_TR2_EVENT".
Для них может быть задано значение «1» или абсолютный путь (точно так же, как текущий GIT_TRACE).

Примечание: в отношении имени переменной среды всегда используйте GIT_TRACExxx, а не GIT_TRxxx.
Так что на самом деле GIT_TRACE2, GIT_TRACE2_PERF или GIT_TRACE2_EVENT.
См. Переименование Git 2.22, упомянутое ниже.

Ниже приводится начальная работа над этой новой функцией трассировки с старыми именами переменных среды:

  • GIT_TR2 предназначен для замены команды GIT_TRACE и logs сводные данные.

  • GIT_TR2_PERF предназначен для замены GIT_TRACE_PERFORMANCE.
    Он расширяет вывод столбцами для командного процесса, потока, репо, абсолютное и относительное истекшее время. Он сообщает о событиях для запуск / остановка дочернего процесса, запуск / остановка потока и функция для каждого потока вложенности.

  • GIT_TR2_EVENT - это новый структурированный формат. Он записывает данные о событии в виде серия записей JSON.

Вызовы в функции trace2 регистрируются в любой из 3 включенных выходных целей без необходимости вызова различных подпрограмм trace_printf* или trace_performance*.

См. коммит a4d3a28 (21 марта 2019 г.) от Джоша Стедмона (steadmon) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 1b40314 , 08 мая 2019 г.)

trace2: запись в каталог цели

Если значение переменной среды trace2 является абсолютным путем, ссылающимся на существующий каталог, записать выходные данные в файлы (по одному на процесс) под указанным каталогом.
Файлы будут именоваться в соответствии с последним компонентом SID trace2, за которым следует счетчик, чтобы избежать возможных конфликтов.

Это делает более удобным собирать следы для каждого вызова git безоговорочно устанавливая соответствующий trace2 envvar постоянным имя каталога.


См. Также commit f672dee (29 апреля 2019) и commit 81567ca , commit 08881b9 , commit bad229a , коммит 26c6f25 , коммит bce9db6 , коммит 800a7f9 , коммит a7bc01e , коммит 39f4317 , коммит a089724 совершить 1703751 (15 апреля 2019 г.) Джефф Хостетлер (jeffhostetler) .
(Объединено с Junio ​​C Hamano - gitster - в commit 5b2d1c0 , 13 мая 2019 г.)

Новая документация теперь включает параметры конфигурации , которые считываются только из системных и глобальных файлов конфигурации (то есть локальные файлы конфигурации и файлы конфигурации рабочего дерева и аргументы командной строки -c не являются уважаемый.)

Пример

$ git config --global trace2.normalTarget ~/log.normal
$ git version
git version 2.20.1.155.g426c96fcdb

выходы

$ cat ~/log.normal
12:28:42.620009 common-main.c:38                  version 2.20.1.155.g426c96fcdb
12:28:42.620989 common-main.c:39                  start git version
12:28:42.621101 git.c:432                         cmd_name version (version)
12:28:42.621215 git.c:662                         exit elapsed:0.001227 code:0
12:28:42.621250 trace2/tr2_tgt_normal.c:124 atexit elapsed:0.001265 code:0

А для показатель производительности :

$ git config --global trace2.perfTarget ~/log.perf
$ git version
git version 2.20.1.155.g426c96fcdb

выходы

$ cat ~/log.perf
12:28:42.620675 common-main.c:38                  | d0 | main                     | version      |     |           |           |            | 2.20.1.155.g426c96fcdb
12:28:42.621001 common-main.c:39                  | d0 | main                     | start        |     |  0.001173 |           |            | git version
12:28:42.621111 git.c:432                         | d0 | main                     | cmd_name     |     |           |           |            | version (version)
12:28:42.621225 git.c:662                         | d0 | main                     | exit         |     |  0.001227 |           |            | code:0
12:28:42.621259 trace2/tr2_tgt_perf.c:211         | d0 | main                     | atexit       |     |  0.001265 |           |            | code:0

Как описано в Git 2.23 (Q3 2019), используемая переменная среды - GIT_TRACE2.

См. коммит 6114a40 (26 июня 2019 г.) от Карло Марсело Аренас Белон (carenas) .
См. коммит 3efa1c6 (12 июня 2019 г.) от Ævar Arnfjörð Bjarmason (avar) .
(Объединено с Junio ​​C Hamano - gitster - in commit e9eaaa4 , 09 Jul 2019)

Это следует за работой, проделанной в Git 2.22: commit 4e0d3aa , commit e4b75d6 (19 мая 2019) SZEDER Gábor (szeder) .
(Объединено Junio ​​C Hamano - gitster - в коммит 463dca6 , 30 мая 2019 г.)

trace2: переименовать переменные среды в GIT_TRACE2 *

Для переменной окружения, которую должны устанавливать пользователи, переменные GIT_TR2* env слишком непонятны, непоследовательны и ужасны.

Большинство установленных GIT_* переменных среды не используют аббревиатуры, а в случае немногих из них (GIT_DIR, GIT_COMMON_DIR, GIT_DIFF_OPTS) совершенно очевидно, что обозначают аббревиатуры (DIR и OPTS).
Но что означает TR? Трек, традиционный, трейлер, транзакция, перевод, трансформация, переход, перевод, пересадка, транспорт, обход, дерево, вызвать, усечь, довериться или ...?!

Средство trace2, как следует из названия суффикса '2', должен в конечном итоге заменить первоначальную трассировку Git.
Разумно ожидать, что соответствующие переменные среды следуйте примеру, и после оригинальных GIT_TRACE переменных они называется GIT_TRACE2; нет такой вещи, как «GIT_TR».

Все специфичные для trace2 конфигурационные переменные очень разумно Секция 'trace2', не в 'tr2'.

OTOH, мы ничего не получаем, опуская последние три символы «след» от имен этих переменных среды .

Итак, давайте переименуем все GIT_TR2* переменные окружения в GIT_TRACE2*, прежде чем они доберутся до стабильного выпуска.

...