Come git non commette nulla senza errori?


92

Sto cercando di scrivere uno script in tessuto che faccia un git commit; tuttavia, se non c'è nulla da eseguire il commit, git esce con uno stato di 1. Lo script deploy lo considera non riuscito e si chiude. Voglio rilevare i fallimenti effettivi di commit, quindi non posso semplicemente dare al tessuto una coperta ignorata per i git commitfallimenti. Come posso consentire che gli errori di commit vuoto vengano ignorati in modo che la distribuzione possa continuare, ma comunque rilevare gli errori causati quando un commit reale non riesce?

def commit():
    local("git add -p && git commit")

Risposte:


157

Cattura questa condizione in anticipo controllando il codice di uscita di git diff?

Ad esempio (in shell):

git add -A
git diff-index --quiet HEAD || git commit -m 'bla'

EDIT: corretto git diffcomando in base al commento di Holger.


64
Notare che git diffè un comando "porcellana" che non dovrebbe essere usato per lo scripting. Quello che molto probabilmente vuoi è git diff-index --quiet HEAD || git commit -m 'bla'. Vedi anche questa risposta .
Holger

1
Per spiegare ulteriormente le cose, il problema git diff --quiet --exit-code --cachedè che valuterà 1(false) solo per i file modificati che non sono stati messi in scena per il commit (file non aggiunti). Il commento con voti positivi è la soluzione migliore per tenere conto di nuovi file ed eliminazioni.
Jorge Bucaran

2
Il commento su git diff-index --quiet HEAD || git commit -m 'bla'dovrebbe essere una risposta a questa domanda.
Rakib,

1
Poiché Tobi non si è preoccupato di correggere la sua risposta in base al commento di Holger, ho modificato la sua risposta da solo.
vog

Nota che git diff-index --quiet HEAD non verifica se il repository locale è aggiornato con l'origine.
bortzmeyer

62

Dalla git commitpagina man:

--allow-empty
    Usually recording a commit that has the exact same tree as its
    sole parent commit is a mistake, and the command prevents you
    from making such a commit. This option bypassesthe safety, and
    is primarily for use by foreign SCM interface scripts.

43
Tuttavia, questo creerebbe effettivamente un commit.
ThiefMaster

6
@ThiefMaster: Esatto. Non posso dire dall'OP se questo è un problema o meno. Immagino che se stai usando i commit automatici, non ti interessa comunque che la tua cronologia sia pulita.
Sven Marnach

1
Preferirei che non si impegnasse se fosse possibile evitarlo. C'è un modo per farlo?
kojiro

3
Questa non è la risposta alla domanda
manojlds

7
@manojlds: "Ovviamente l'OP non vuole creare un commit vuoto." Oggi ho lasciato la mia sfera di cristallo a casa, quindi non lo sapevo. perso il -p, però, ma ancora
Sven Marnach

5
with settings(warn_only=True):
  run('git commit ...')

Ciò fa sì che il tessuto ignori l'errore. Ha il vantaggio di non creare commit vuoti.

Puoi avvolgerlo in un livello aggiuntivo with hide('warnings'):per sopprimere totalmente l'output, altrimenti otterrai una nota nell'output del fabric che il commit non è riuscito (ma il fabfile continua ad essere eseguito).


3
OP ha scritto "Voglio rilevare gli errori di commit effettivi "; questo codice nasconderà tutti gli errori di commit.
bfontaine

-2

prova / cattura bambino!

from fabric.api import local
from fabric.colors import green


def commit(message='updates'):
    try:
        local('git add .')
        local('git commit -m "' + message + '"')
        local('git push')
        print(green('Committed and pushed to git.', bold=False))
    except:
        print(green('Done committing, likely nothing new to commit.', bold=False))

10
Per spiegare il motivo per cui si ottiene un voto negativo: possono esserci altri errori che si desidera rilevare. Non vuoi semplicemente presumere che in caso di errore, potrebbe essere che non sia necessario commettere nulla. - Inoltre, ma non è correlato: non usare mai un generico except:, usa except Exceptiono così.
Albert
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.