Как я могу отлаживать проблемы git/git-shell?

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

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

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

Ответ 1

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

GIT_CURL_VERBOSE=1 GIT_TRACE=1 git pull origin master

Ответ 2

отладка

В 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 [email protected]

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

ssh -vvvT -p 443 [email protected]

Примечание. Уменьшите число -v чтобы уменьшить уровень -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
...

Ответ 3

попробуйте следующее:

GIT_TRACE=1 git pull origin master

Ответ 4

Если его более 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 '.

Ответ 5

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

См. Commit 73e57aa, совершите 74c682d (23 мая 2016 года) Элиа Пинто (devzero2000).
Помощник: Торстен Бёгерсхаузен (tboegi), Рамсей Джонс, Юнио С Хамано (gitster), Эрик Саншайн (sunshineco) и Джефф Кинг (peff).
(Слияние с Юнио С Хамано - gitster - в совершении 2f84df2, 06 июля 2016 года)

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

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

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

GIT_TRACE_CURL

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

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


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

См. Commit 14e2411, совершите 81590bf, совершите 4527aa1, совершите 4eee6c6 (07 Sep 2016) от Elia Pinto (devzero2000).
(Слияние с Юнио С Хамано - gitster - в совершении 930b67e, 12 Sep 2016)

Используйте новую переменную среды GIT_TRACE_CURL вместо устаревшего GIT_CURL_VERBOSE.

GIT_TRACE_CURL=true git clone --quiet $HTTPD_URL/smart/repo.git

Ответ 6

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

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

Ответ 7

Для более старых версий git (1.8 и ранее)

Я не смог найти подходящего способа включить отладку SSH в старых версиях git и ssh. Я искал переменные среды, используя ltrace -e getenv ..., и не смог найти какую-либо комбинацию переменных GIT_TRACE или SSH_DEBUG, которая бы работала.

Вместо этого здесь есть рецепт для временного внедрения 'ssh -v' в последовательность git-> ssh:

$ echo '/usr/bin/ssh -v ${@}' >/tmp/ssh
$ chmod +x /tmp/ssh
$ PATH=/tmp:${PATH} git clone ...
$ rm -f /tmp/ssh

Вот вывод из git версии 1.8.3 с версией ssh OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 февраля 2013 г. клонирование репозитория github:

$ (echo '/usr/bin/ssh -v ${@}' >/tmp/ssh; chmod +x /tmp/ssh; PATH=/tmp:${PATH} \
   GIT_TRACE=1 git clone https://github.com/qneill/cliff.git; \
   rm -f /tmp/ssh) 2>&1 | tee log
trace: built-in: git 'clone' 'https://github.com/qneill/cliff.git'
trace: run_command: 'git-remote-https' 'origin' 'https://github.com/qneill/cliff.git'
Cloning into 'cliff'...
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /home/q.neill/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to github.com ...
...
Transferred: sent 4120, received 724232 bytes, in 0.2 seconds
Bytes per second: sent 21590.6, received 3795287.2
debug1: Exit status 0
trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: exec: 'git' 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: built-in: git 'rev-list' '--objects' '--stdin' '--not' '--all'

Ответ 8

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

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) . (Merged by Junio C Hamano -- [TG423] -- in commit 1b40314, 08 May 2019)
trace2: запись в каталог цели

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

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

См. также


commit f672dee (29 апреля 2019 года) и коммит 81567ca , коммит 08881b9 , коммит bad229a , коммит 26c6f25 ,commit bce9db6 ,commit 800a7f9 ,commit a7bc01e ,commit 39f4317 ,commit a089724 , совершить 1703751 (15 апреля 2019 г.) Джеффа Хостетлера (jeffhostetler). (Merged by Junio C Hamano -- [TG427] -- in commit 5b2d1c0, 13 May 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 г.), автор Æвар Арнфьорд Бьярмасон (avar). (Merged by Junio C Hamano -- [TG436] -- in commit e9eaaa4, 09 Jul 2019) Это следует за работой, проделанной в Git 2.22:
commit 4e0d3aa

commit e4b75d6(19 мая 2019 г.) SZEDER Gábor (szeder). . (Merged by Junio C Hamano -- [TG438] -- in commit 463dca6, 30 May 2019)
trace2: переименование переменных среды в GIT_TRACE2 *

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

Most of the established GIT_* environment variables don't use abbreviations, и in case of the few that do (GIT_DIR, GIT_COMMON_DIR, GIT_DIFF_OPTS) it quite obvious what the abbreviations (DIR и OPTS) stand for.
But what does TR stand for? Track, traditional, trailer, transaction, transfer, transformation, transition, translation, transplant, transport, traversal, tree, trigger, truncate, trust, or...?!

Средство trace2, как следует из названия суффикса "2", должен в конечном итоге заменить оригинальную трассировку Git.

Разумно ожидать, что соответствующие переменные среды следуйте примеру, и после оригинальных GIT_TRACE переменных они называется GIT_TRACE2; нет такого понятия, как "GIT_TR".
Все специфичные для trace2 конфигурационные переменные очень разумно Раздел "trace2", а не "tr2".

ОТО,

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

Git 2.24 (Q3 2019) улучшает инициализацию репозитория Git.


См.

commit 22932d9 ,commit 5732f2b ,commit 58ebccb (06 августа 2019 г.) от Джеффа Кинга (peff) ..
(Merged by Junio C Hamano -- [TG456] -- in commit b4a1eec, 09 Sep 2019)

common-main: задержка инициализации trace2

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

Но запуск trace2 относительно тяжелый, так как мы должны прочитать Конфигурация на диске, чтобы решить, следует ли отслеживать.
Это может вызвать неожиданные взаимодействия с другими общими основными инициализации. Например, мы докажем код конфигурации перед вызовом initialize_the_repository(), и обычный инвариант, который the_repository никогда не будет равен NULL, не будет удерживаться.

Давайте протолкнем инициализацию trace2 дальше вниз в общем, чтобы незадолго до того, как мы выполним cmd_main().


Git 2.24 (Q4 2019) также гарантирует, что вывод подсистемы trace2 теперь отформатирован более красиво.

Смотрите коммит 742ed63, коммит e344305, коммит c2b890a (09 августа 2019 г.), коммит ad43e37, коммит 04f10d3, зафиксировать da4589c (8 августа 2019 г.) и зафиксировать 371df1b (31 июля 2019 г.) от Джеффа Хостетлера (jeffhostetler).
. (Merged by Junio C Hamano -- [TG465] -- in commit 93fc876, 30 Sep 2019)

И еще Git 2.24

Смотрите коммит 87db61a, коммит 83e57b0 (04 октября 2019 г.) и коммит 2254101, коммит 3d4548e (03 октября 2019 г.) от Джош Стедмон (steadmon).
(Merged by Junio C Hamano -- [TG467] -- in commit d0ce4d9, 15 Oct 2019)

trace2: отменить новые трассировки, если в целевом каталоге слишком много файлов

Signed-off-by: Josh Steadmon

trace2 может записывать файлы в целевой каталог.
При интенсивном использовании этот каталог может заполняться файлами, что создает трудности для систем обработки трассировки.

Этот патч добавляет опцию конфигурации (trace2.maxFiles) для установки максимального количества файлов, которые trace2 будет записывать в целевой каталог.

Следующее поведение активируется, когда для maxFiles задано положительное целое число:

  • Когда trace2 записывает файл в целевой каталог, сначала проверьте, следует ли отбрасывать следы. Следы должны быть удалены, если:

    • есть сторожевой файл, объявляющий, что файлов слишком много
    • ИЛИ, количество файлов превышает trace2.maxFiles.
      В последнем случае мы создаем сторожевой файл с именем git-trace2-discard для ускорения будущих проверок.

Предполагается, что отдельная система обработки трасс имеет дело с генерируемыми трассами; как только он обработает и удалит файл-страж, будет безопасно снова генерировать новые файлы трассировки.

Значение по умолчанию для trace2.maxFiles равно нулю, что отключает проверку количества файлов.

Конфигурацию также можно переопределить с помощью новой переменной среды: GIT_TRACE2_MAX_FILES.


А в Git 2.24 (Q4 2019) учат trace2 о стадиях git push.

Смотрите коммит 25e4b80, коммит 5fc3118 (02 октября 2019 г.) от Джоша Стедмона (steadmon).
(Merged by Junio C Hamano -- [TG480] -- in commit 3b9ec27, 15 Oct 2019)

push: добавить инструментарий trace2

Signed-off-by: Josh Steadmon

Добавьте области trace2 в transport.c и builtin/push.c, чтобы лучше отслеживать время, затрачиваемое на различных этапах нажатия:

  • Список ссылок
  • Проверка подмодулей
  • Толкаем субмодули
  • Нажав ссылки