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 statusnon cambia quando ci sono cambiamenti non impegnati. Fornisce, tuttavia, l' --porcelainopzione, che consente di git status --porcelainformattare 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 --porcelaincome 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=noopzione 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 statuserrore 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 statusnon fornisca un codice di uscita significativo quando la directory di lavoro è sporca, git difffornisce l' --exit-codeopzione, che la rende simile all'utilità diff , ovvero uscire con lo stato 1quando c'erano differenze e 0quando 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 diffpossa 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.