Возвращает ли git конкретные коды ошибок возврата?

86

Как ошибки слияния или ошибки перебазирования. Есть ли уникальный код ошибки?

поймод
источник

Ответы:

56

Я настроил тест на провал. Вот что у меня получилось:

$ git merge newbranch
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

$ echo $?
1

0Как и ожидалось, Git возвращается при правильном слиянии.

Chrisaycock
источник
2
Проблема в том, что в документации для git merge(в 1.7.4 - kernel.org/pub/software/scm/git/docs/v1.7.4/git-merge.html ) только упоминается статус возврата в одном месте (если вы используете "- -ff-only "и он не может выполнить быструю фиксацию вперед, он возвращает ненулевое значение - он явно не говорит, что возвращается, если все работает или возник конфликт слияния.
Мэтт Кертис,
9
@Matt: Команды Git очень, очень хорошо возвращают ноль в случае успеха и ненулевое значение (обычно 1) в противном случае. Вы всегда можете безопасно связать команды вместе с помощью &&; вот как реализованы их тесты.
Cascabel
17
Git не подходит для возврата последовательных и разумных кодов выхода. Например, выполнение git commit без изменений завершится с кодом 1, но, черт возьми, это не ошибка.
pfalcon
3
Из комментария в исходном коде builtin / merge.c: «Бэкэнд завершает работу с 1, когда конфликты остаются разрешенными, с 2, когда он вообще не обрабатывает данное слияние».
Майк
такое git rebaseже поведение?
osexp2003
60

Короче нет. Вы увидите код выхода 1 для ошибок и 0 для успеха.

Из быстрого поиска источника можно найти некоторые из ожидаемых 127 и 128 для их конкретных целей (команда не найдена, ошибки уже сообщены), а также несколько необычных кодов в нескольких местах, но для стандартных ошибок это все exit(1).

Каскабель
источник
3
Это очень раздражает при отладке ловушек фиксации. Какой смысл даже иметь код выхода в ваших хуках git, если неудачная фиксация просто всегда будет возвращать 1 вместо вашего кода выхода.
Novice C
* Приложения nix возвращают статус 0 для полного успеха. Другие коды состояния определяются приложением. Есть еще 255 кодов, значения которых зависят от приложения. Подробности смотрите на их manстраницах.
shawnhcorey
3
@shawnhcorey Проблема в том, что git не документирует ненулевые коды ошибок.
Ян Кемп
13

Запуск git statusв репозитории, отличном от git, возвращает 128, а не 1, что помогает быстро определить, существует ли репозиторий git или нет.

Гас Шортц
источник
6

Ошибка 128, при отсутствии сообщения об ошибке от git, может быть уловкой «неожиданной проблемы».

Я получал это при операциях, которые требовали изменения файлов в .git (например, " git checkout -- myfile", чтобы вернуть измененный файл) другим пользователем. (В моем случае " chmod -R og+w .git" это исправлено; естественно, не делайте этого, если вы не понимаете, как это влияет на безопасность в вашем случае!)

Даррен Кук
источник
6

git push --delete origin a_remote_tag_name

Это возвращает 256, если тег не существует с использованием версии git 1.8.3.1

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

Manningr
источник
2

Git 2.24 (4 квартал 2019 г.) действительно иллюстрирует, как gitкоманды возвращают код.

См. Фиксацию 50094ca , фиксацию c1a6f21 , фиксацию 854b5cb , фиксацию dd2b6b6 , фиксацию 6bd26f5 , фиксацию c6ec6da , фиксацию f2e2fa8 , фиксацию 460609c , фиксацию 92014b6 , фиксацию 0ab74e9 , фиксацию cb46c40 , фиксацию b562a54 (27 августа 2019 г.) и фиксацию b562a54 ( 27 августа 2019 г.) и пользователя Denton Liu ( Denton-L) .
(Объединено Junio ​​C Hamano - gitster- в коммите 1c6fc94 , 30 сентября 2019 г.)

t4014: перестать терять коды возврата команд git

В настоящее время есть два способа потери кодов возврата команд Git.

Первый способ - когда команда находится перед конвейером. В канале используется только код возврата последней команды. Таким образом, коды возврата для всех остальных команд будут замаскированы.
Перепишите каналы так, чтобы в восходящем потоке не было команд Git.

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

Поэтому вместо написания:

git cat-file commit rebuild-1 | grep "^Side .* with .* backslash-n"

Тип:

git cat-file commit rebuild-1 >actual &&
    grep "^Side .* with .* backslash-n" actual
VonC
источник