Analisar a saída de git statusé uma péssima idéia, pois a saída deve ser legível por humanos, não legível por máquina. Não há garantia de que a saída permaneça a mesma nas versões futuras do Git ou em ambientes configurados de maneira diferente.
O comentário dos UVVs está no caminho certo, mas, infelizmente, o código de retorno de git statusnão muda quando há alterações não confirmadas. No entanto, ele fornece a --porcelainopção, que faz com que a saída git status --porcelainseja formatada em um formato fácil de analisar para scripts e permanecerá estável nas versões do Git e independentemente da configuração do usuário.
Podemos usar a saída vazia git status --porcelaincomo um indicador de que não há alterações a serem confirmadas:
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Se não nos importamos com arquivos não rastreados no diretório de trabalho, podemos usar a --untracked-files=noopção para desconsiderar aqueles:
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
Para tornar isso mais robusto em relação às condições que realmente causam git statusfalhas sem saída stdout, podemos refinar a verificação para:
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Também é importante notar que, embora git statusnão dê um código de saída significativo quando o diretório de trabalho é impuro, git difffornece a --exit-codeopção, o que o comporta de maneira semelhante ao utilitário diff , ou seja, sair com status 1quando houve diferenças e 0quando nenhuma foi encontrada.
Usando isso, podemos verificar se há alterações em estágios com:
git diff --exit-code
e preparadas, mas não confirmadas, alterações com:
git diff --cached --exit-code
Embora git diffpossa relatar arquivos não rastreados em sub-módulos por meio de argumentos apropriados --ignore-submodules, infelizmente parece que não há como reportar arquivos não rastreados no diretório de trabalho real. Se arquivos não rastreados no diretório de trabalho forem relevantes, git status --porcelainprovavelmente é a melhor aposta.