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 status
não muda quando há alterações não confirmadas. No entanto, ele fornece a --porcelain
opção, que faz com que a saída git status --porcelain
seja 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 --porcelain
como 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=no
opçã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 status
falhas 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 status
não dê um código de saída significativo quando o diretório de trabalho é impuro, git diff
fornece a --exit-code
opção, o que o comporta de maneira semelhante ao utilitário diff , ou seja, sair com status 1
quando houve diferenças e 0
quando 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 diff
possa 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 --porcelain
provavelmente é a melhor aposta.