Czy git zwraca określone kody błędów powrotu?

86

Podobnie jak błędy scalania lub błędy ponownego bazowania. Czy ma unikalny kod błędu?

poymode
źródło

Odpowiedzi:

56

Ustawiłem test na niepowodzenie. Oto co mam:

$ 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 zwraca, 0gdy scala się poprawnie, zgodnie z oczekiwaniami.

chrisaycock
źródło
2
Problem w tym, że dokumenty dla git merge(w 1.7.4 - kernel.org/pub/software/scm/git/docs/v1.7.4/git-merge.html ) wspominają o statusie zwrotu tylko w jednym miejscu (jeśli używasz "- -ff-only "i nie może wykonać szybkiego zatwierdzenia do przodu, zwraca wartość niezerową - nie informuje wyraźnie, co jest zwracane, jeśli wszystko działa lub jeśli wystąpił konflikt scalania.
Matt Curtis,
9
@Matt: Polecenia Git są bardzo, bardzo dobre w zwracaniu zera w przypadku sukcesu i niezerowej wartości (ogólnie 1) w przeciwnym razie. Zawsze możesz bezpiecznie łączyć polecenia za pomocą &&; w ten sposób wdrażane są ich testy.
Cascabel
17
Git nie nadaje się do zwracania spójnych i rozsądnych kodów wyjścia. Na przykład wykonanie git commit bez zmian zakończy się kodem 1, ale do diabła, to nie jest błąd.
pfalcon
3
Z komentarza w kodzie źródłowym pliku builtin / merge.c: „Backend kończy działanie z 1, gdy konflikty mają zostać rozwiązane, z 2, gdy w ogóle nie obsługuje danego scalania”.
Mike
jest git rebaseto samo zachowanie?
osexp2003
60

Krótko mówiąc, nie. Zobaczysz kod zakończenia 1 dla błędów i 0 dla sukcesu.

Z szybkiego grepowania źródła wynika, że ​​jest kilka oczekiwanych 127 i 128 dla ich konkretnych celów (polecenie nie zostało znalezione, błędy już zgłoszone) i kilka nietypowych kodów w kilku miejscach, ale dla błędów run of the mill jest to wszystko exit(1).

Cascabel
źródło
3
Jest to wyjątkowo irytujące w przypadku debugowania punktów zaczepienia zatwierdzeń. Jaki sens ma nawet posiadanie kodu wyjścia w hakach git, jeśli nieudane zatwierdzenie zawsze zwróci 1 zamiast kodu wyjścia podpięcia.
Nowicjusz C
* Aplikacje nix zwracają stan 0 dla pełnego sukcesu. Inne kody stanu są określane przez aplikację. Istnieje 255 innych kodów, których znaczenie zależy od aplikacji. Zobacz ich manstrony, aby uzyskać szczegółowe informacje.
shawnhcorey
3
@shawnhcorey Problem polega na tym, że git nie dokumentuje swoich niezerowych kodów błędów.
Ian Kemp,
13

Uruchomienie git statusna repozytorium non-git zwraca 128, a nie 1, co jest pomocne w szybkim określeniu, czy repozytorium git istnieje, czy nie.

Gus Shortz
źródło
6

Błąd 128, bez komunikatu o błędzie z gita, może być typowym przykładem „nieoczekiwanego problemu”.

Otrzymywałem to w przypadku operacji, które wymagały modyfikacji plików w .git (np. „ git checkout -- myfile” W celu przywrócenia zmodyfikowanego pliku) przez innego użytkownika. (W moim przypadku " chmod -R og+w .git" to naprawiłem; oczywiście nie rób tego, chyba że rozumiesz wpływ na bezpieczeństwo twojego przypadku!)

Darren Cook
źródło
6

git push --delete origin a_remote_tag_name

Zwraca 256, jeśli tag nie istnieje przy użyciu wersji git 1.8.3.1

Byłoby miło mieć skonsolidowaną listę konkretnych kodów powrotu zwracanych przez każde polecenie i to, co one wskazują. Może to również pomóc w zapobieganiu zmianie znaczenia kodu powrotu (na którym mogą polegać skrypty automatyzacji).

manningr
źródło
2

Git 2.24 (Q4 2019) ilustruje, jak gitpolecenia zwracają kod.

Zobacz zatwierdzenie 50094ca , zatwierdzenie c1a6f21 , zatwierdzenie 854b5cb , zatwierdzenie dd2b6b6 , zatwierdzenie 6bd26f5 , zatwierdzenie c6ec6da , zatwierdzenie f2e2fa8 , zatwierdzenie 460609c , zatwierdzenie 92014b6 , zatwierdzenie 0ab74e9 , zatwierdzenie cb46c40 , zatwierdzenie b562a54 (27 sierpnia 2019 r.) I 20 fe commit użytkownika Denton Liu ( Denton-L) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu 1c6fc94 , 30 września 2019)

t4014: przestań tracić kody powrotu poleceń git

Obecnie istnieją dwa sposoby utraty kodów powrotnych poleceń Git.

Pierwszy sposób polega na tym, że polecenie znajduje się w górnej części potoku. W potoku używany jest tylko kod powrotu ostatniego polecenia. W ten sposób wszystkie inne polecenia będą miały maskowane kody powrotu.
Przepisz potoki, aby nie było żadnych poleceń Gita.

Innym sposobem jest sytuacja, gdy polecenie znajduje się w podpowłoce bez przypisania .
Kod powrotu zostanie utracony na rzecz polecenia otaczającego.
Przepisz instancje tego w taki sposób, że polecenia Git wysyłane do pliku, a polecenia otaczające wywołują tylko podpowłoki z poleceniami spoza Git.

Więc zamiast pisać:

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

Rodzaj:

git cat-file commit rebuild-1 >actual &&
    grep "^Side .* with .* backslash-n" actual
VonC
źródło