Gibt git bestimmte Rückgabefehlercodes zurück?

86

Wie das Zusammenführen von Fehlern oder das erneute Basieren von Fehlern. Hat es einen eindeutigen Fehlercode?

Poymode
quelle

Antworten:

56

Ich habe einen Test eingerichtet, der fehlschlägt. Das habe ich bekommen:

$ 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 kehrt zurück, 0wenn es wie erwartet korrekt zusammengeführt wird.

Chrisaycock
quelle
2
Das Problem ist, dass in den Dokumenten für git merge(unter 1.7.4 - kernel.org/pub/software/scm/git/docs/v1.7.4/git-merge.html ) der Rückgabestatus nur an einer Stelle erwähnt wird (wenn Sie "-" verwenden) -ff-only "und es kann kein Fast-Forward-Commit ausgeführt werden. Es gibt einen Wert ungleich Null zurück. Es wird nicht explizit angegeben, was zurückgegeben wird, wenn alles funktioniert oder wenn ein Zusammenführungskonflikt aufgetreten ist.
Matt Curtis
9
@Matt: Git-Befehle sind sehr, sehr gut darin, Null für den Erfolg zurückzugeben und ansonsten nicht Null (im Allgemeinen 1). Sie können Befehle jederzeit sicher mit &&verketten. So werden ihre Tests implementiert.
Cascabel
17
Git ist nicht gut für die Rückgabe konsistenter und sinnvoller Exit-Codes. Wenn Sie beispielsweise git commit ohne Änderungen ausführen, wird Code 1 beendet, aber es ist kein Fehler.
Pfalcon
3
Aus einem Kommentar im Quellcode von builtin / merge.c: "Das Backend wird mit 1 beendet, wenn Konflikte noch gelöst werden müssen, und mit 2, wenn die angegebene Zusammenführung überhaupt nicht behandelt wird."
Mike
ist git rebasedas gleiche Verhalten?
osexp2003
59

Kurz gesagt, nein. Sie sehen den Exit-Code 1 für Fehler und 0 für den Erfolg.

Nach einem kurzen Abrufen der Quelle gibt es einige der erwarteten 127 und 128 für ihre spezifischen Zwecke (Befehl nicht gefunden, bereits gemeldete Fehler) und einige ungewöhnliche Codes an einigen Stellen, aber für Run-of-the-Mill-Fehler ist dies der Fall alle exit(1).

Cascabel
quelle
3
Dies ist besonders ärgerlich beim Debuggen Ihrer Commit-Hooks. Was bringt es, sogar einen Exit-Code in Ihren Git-Hooks zu haben, wenn ein fehlgeschlagenes Commit nur immer 1 anstelle Ihres Hook-Exit-Codes zurückgibt?
Anfänger C
* nix Apps geben für den vollständigen Erfolg den Status 0 zurück. Andere Statuscodes werden von der App festgelegt. Es gibt 255 andere Codes, deren Bedeutung von der App abhängt. Siehe ihre manSeiten für Details.
Shawnhcorey
3
@shawnhcorey Das Problem ist, dass git seine Fehlercodes ungleich Null nicht dokumentiert.
Ian Kemp
13

Das Ausführen git statusauf einem Nicht-Git-Repo gibt 128 statt 1 zurück. Dies ist hilfreich, um schnell festzustellen, ob ein Git-Repo vorhanden ist oder nicht.

Gus Shortz
quelle
6

Fehler 128 ohne Fehlermeldung von git könnte ein Allheilmittel für "unerwartetes Problem" sein.

Ich habe dies bei Vorgängen erhalten, bei denen Dateien unter .git (z. B. " git checkout -- myfile", um eine geänderte Datei zurückzusetzen) von einem anderen Benutzer geändert werden mussten. (In meinem Fall " chmod -R og+w .git" wurde das Problem behoben. Tun Sie dies natürlich nur, wenn Sie die Sicherheitsauswirkungen für Ihren Fall verstanden haben!)

Darren Cook
quelle
6

git push --delete origin a_remote_tag_name

Dies gibt 256 zurück, wenn das Tag mit der Git-Version nicht vorhanden ist 1.8.3.1

Es wäre schön, wenn jeder Befehl eine konsolidierte Liste spezifischer Rückkehrcodes und deren Angabe zurückgeben würde. Dies kann auch dazu beitragen, zu verhindern, dass die Bedeutung des Rückkehrcodes geändert wird (auf die sich Automatisierungsskripte möglicherweise stützen).

manningr
quelle
2

Git 2.24 (Q4 2019) zeigt, wie gitBefehle Code zurückgeben.

Sehen Sie verpflichten 50094ca , begehen c1a6f21 , begehen 854b5cb , begehen dd2b6b6 , begehen 6bd26f5 , begehen c6ec6da , begehen f2e2fa8 , begehen 460609c , begehen 92014b6 , begehen 0ab74e9 , begehen cb46c40 , begehen b562a54 (27. August 2019) und begehen fe49814 (20. August 2019) von Denton Liu ( Denton-L) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 1c6fc94 , 30. September 2019)

t4014: Hören Sie auf, Rückkehrcodes von Git-Befehlen zu verlieren

Derzeit gibt es zwei Möglichkeiten, wie die Rückkehrcodes von Git-Befehlen verloren gehen.

Der erste Weg ist, wenn sich ein Befehl vor einer Pipe befindet. In einer Pipe wird nur der Rückkehrcode des letzten Befehls verwendet. Somit werden bei allen anderen Befehlen die Rückkehrcodes maskiert.
Schreiben Sie Pipes neu, sodass keine Git-Befehle vorgelagert sind.

Der andere Weg ist, wenn sich ein Befehl in einer Subshell ohne Zuweisung befindet .
Der Rückkehrcode geht zugunsten der umgebenden Befehle verloren.
Schreiben Sie Instanzen davon so um, dass Git-Befehle, die in eine Datei ausgegeben werden, und umgebende Befehle nur Subshells mit Nicht-Git-Befehlen aufrufen.

Also anstatt zu schreiben:

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

Art:

git cat-file commit rebuild-1 >actual &&
    grep "^Side .* with .* backslash-n" actual
VonC
quelle