Git restituisce codici di errore di ritorno specifici?


87

Come la fusione di errori o il rebase degli errori. Ha un codice di errore univoco?

Risposte:


56

Ho impostato un test per fallire. Questo è quello che ho ottenuto:

$ 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 ritorna 0quando si unisce correttamente, come previsto.


2
Il problema è che i documenti per git merge(in 1.7.4 - kernel.org/pub/software/scm/git/docs/v1.7.4/git-merge.html ) menzionano solo lo stato di ritorno in un posto (se usi "- -ff-only "e non può eseguire un commit di avanzamento rapido, restituisce un valore diverso da zero - non dice esplicitamente cosa viene restituito se tutto funziona o se c'è stato un conflitto di unione.
Matt Curtis

10
@ Matt: i comandi Git sono molto, molto buoni nel restituire zero in caso di successo e diverso da zero (generalmente 1) altrimenti. Puoi sempre concatenare i comandi insieme in modo sicuro con &&; è così che vengono implementati i loro test.
Cascabel

17
Git non è adatto per restituire codici di uscita coerenti e sensati. Ad esempio, eseguire git commit senza modifiche uscirà con il codice 1, ma diamine, non è un errore.
falco

3
Da un commento nel codice sorgente di builtin / merge.c: "Il backend esce con 1 quando i conflitti devono essere risolti, con 2 quando non gestisce affatto l'unione data."
Mike,

è git rebaselo stesso comportamento?
osexp2003

60

In breve, no. Vedrai il codice di uscita 1 per gli errori e 0 per il successo.

Da un rapido grepping del sorgente, ci sono alcuni dei 127 e 128 previsti per i loro scopi specifici (comando non trovato, errori già segnalati) e alcuni codici insoliti in alcuni punti, ma per errori run of the mill, è tutto exit(1).


3
Questo è molto fastidioso per il debug dei tuoi hook di commit. Qual è il punto di avere anche un codice di uscita nei tuoi git hook se un commit fallito restituirà sempre 1 invece del tuo codice di uscita hook.
Novice C

* Le app nix restituiscono uno stato di 0 per il completo successo. Altri codici di stato sono determinati dall'app. Esistono altri 255 codici il cui significato dipende dall'app. Vedere le loro manpagine per i dettagli.
shawnhcorey

3
@shawnhcorey Il problema è che git non documenta i suoi codici di errore diversi da zero.
Ian Kemp

13

L'esecuzione git statussu un repository non git restituisce 128, non 1, il che è utile per determinare rapidamente se un repository git esiste o meno.


7

git push --delete origin a_remote_tag_name

Restituisce 256 se il tag non esiste utilizzando la versione git 1.8.3.1

Sarebbe bello avere un elenco consolidato di codici di ritorno specifici restituiti da ciascun comando e cosa indicano. Ciò potrebbe anche aiutare a prevenire la modifica dei significati del codice di ritorno (su cui potrebbero fare affidamento gli script di automazione).


6

L'errore 128, senza alcun messaggio di errore da git, potrebbe essere un "problema imprevisto".

Stavo ottenendo questo su operazioni che dovevano modificare i file sotto .git (ad esempio " git checkout -- myfile" per ripristinare un file modificato) da un utente diverso. (Nel mio caso " chmod -R og+w .git" risolto il problema; naturalmente, non farlo a meno che tu non comprenda le implicazioni di sicurezza per il tuo caso!)


2

Git 2.24 (Q4 2019) illustra come i gitcomandi restituiscono il codice.

Vedere commit 50094ca , commit c1a6f21 , commit 854b5cb , commit dd2b6b6 , commit 6bd26f5 , commit c6ec6da , commit f2e2fa8 , commit 460609c , commit 92014b6 , commit 0ab74e9 , commit cb46c40 , commit b562a54 (27 agosto 2019) e commit 20 agosto 2019 di Denton Liu ( Denton-L) .
(Fuso da Junio ​​C Hamano - gitster- nel commit 1c6fc94 , 30 settembre 2019)

t4014: smetti di perdere i codici di ritorno dei comandi git

Attualmente, ci sono due modi in cui i codici di ritorno dei comandi Git vengono persi.

Il primo modo è quando un comando è a monte di un tubo. In una pipe, viene utilizzato solo il codice di ritorno dell'ultimo comando. Pertanto, tutti gli altri comandi avranno i loro codici di ritorno mascherati.
Riscrivi le pipe in modo che non ci siano comandi Git a monte.

L'altro modo è quando un comando è in una subshell non assegnata .
Il codice di ritorno verrà perso a favore del comando circostante.
Riscrivi le istanze di questo in modo che i comandi Git vengano emessi in un file e i comandi circostanti chiamino solo subshell con comandi non Git.

Quindi, invece di scrivere:

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

Genere:

git cat-file commit rebuild-1 >actual &&
    grep "^Side .* with .* backslash-n" actual
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.