Чи повертає 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

Git повертається, 0коли він правильно зливається, як і слід було очікувати.


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 без змін призведе до виходу з кодом 1, але, біса, це не помилка.
pfalcon

3
З коментаря у вихідному коді вбудованого / злиття.c: "Бекенд виходить з 1, коли конфлікти залишаються для вирішення, з 2, коли він взагалі не обробляє дане злиття"
Майк

така git rebaseж поведінка?
osexp2003

60

Словом, ні. Ви побачите код виходу 1 для помилок і 0 для успіху.

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


3
Це додатково дратує для налагодження ваших хуків комітів. Який сенс навіть мати код виходу у ваших git-хуках, якщо невдалий коміт просто збирається завжди повернути 1 замість вашого коду виходу з хука.
Новачок С

* Програми nix повертають статус 0 для повного успіху. Інші коди стану визначаються додатком. Існує 255 інших кодів, значення яких залежать від програми. Детальніше див. На їх manсторінках.
shawnhcorey

3
@shawnhcorey Проблема в тому, що git не документує свої ненульові коди помилок.
Ian Kemp

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

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


2

Git 2.24 (Q4 2019) ілюструє, як git команди повертають код.

Див. Коміт 50094ca , коміт c1a6f21 , коміт 854b5cb , коміт dd2b6b6 , коміт 6bd26f5 , коміт c6ec6da , коміт f2e2fa8 , коміт 460609c , коміт 92014b6 , коміт 0ab74e9 , коміт cb46c40 , коміт b562a54 (27 серпня 2019), та коміт 20 серпня 2019), від Denton Лю ( 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.