Analizzare l'output di git status
è una cattiva idea perché l'output deve essere leggibile dall'uomo, non leggibile dalla macchina. Non esiste alcuna garanzia che l'output rimarrà lo stesso nelle versioni future di Git o in ambienti configurati in modo diverso.
Il commento di UVV è sulla buona strada, ma sfortunatamente il codice di ritorno di git status
non cambia quando ci sono cambiamenti non impegnati. Fornisce, tuttavia, l' --porcelain
opzione, che consente di git status --porcelain
formattare l'output di in un formato facile da analizzare per gli script e rimarrà stabile tra le versioni di Git e indipendentemente dalla configurazione dell'utente.
Possiamo usare l'output vuoto di git status --porcelain
come indicatore che non ci sono cambiamenti da impegnare:
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Se non ci interessa i file non tracciati nella directory di lavoro, possiamo usare l' --untracked-files=no
opzione per ignorare quelli:
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
Per renderlo più robusto rispetto alle condizioni che in realtà causano un git status
errore senza output stdout
, possiamo perfezionare il controllo per:
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Vale anche la pena notare che, sebbene git status
non fornisca un codice di uscita significativo quando la directory di lavoro è sporca, git diff
fornisce l' --exit-code
opzione, che la rende simile all'utilità diff , ovvero uscire con lo stato 1
quando c'erano differenze e 0
quando non ne sono state trovate.
Usando questo, possiamo verificare le modifiche non messe in scena con:
git diff --exit-code
e messo in scena modifiche ma non impegnate con:
git diff --cached --exit-code
Sebbene git diff
possa riferire sui file non tracciati nei sottomoduli tramite argomenti appropriati --ignore-submodules
, sfortunatamente sembra che non ci sia modo di farlo riportare sui file non tracciati nella directory di lavoro effettiva. Se i file non tracciati nella directory di lavoro sono rilevanti, git status --porcelain
è probabilmente la scommessa migliore.