Analyser la sortie de git status
est une mauvaise idée car la sortie est destinée à être lisible par l'homme, pas lisible par une machine. Rien ne garantit que la sortie restera la même dans les futures versions de Git ou dans des environnements configurés différemment.
Le commentaire UVV est sur la bonne voie, mais malheureusement, le code de retour de git status
ne change pas lorsqu'il y a des modifications non validées. Cependant, il fournit l' --porcelain
option qui git status --porcelain
formatera la sortie de dans un format facile à analyser pour les scripts et restera stable à travers les versions de Git et quelle que soit la configuration de l'utilisateur.
Nous pouvons utiliser une sortie vide de git status --porcelain
comme indicateur qu'il n'y a aucune modification à valider:
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Si nous ne nous soucions pas des fichiers non suivis dans le répertoire de travail, nous pouvons utiliser l' --untracked-files=no
option pour ignorer ceux:
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
Pour rendre plus robuste contre les conditions qui en fait l' origine git status
à l' échec sans sortie stdout
, nous pouvons affiner le chèque à:
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Il est également intéressant de noter que, bien git status
que ne donnant pas de code de sortie significatif lorsque le répertoire de travail est malpropre, git diff
fournit l' --exit-code
option qui le rend similaire à l' utilitaire diff , c'est-à-dire quitter avec un statut 1
lorsqu'il y avait des différences et 0
aucun.
En utilisant cela, nous pouvons vérifier les modifications non mises en scène avec:
git diff --exit-code
et mis en scène, mais pas commis des changements avec:
git diff --cached --exit-code
Bien git diff
qu’il soit possible de signaler les fichiers non suivis dans des sous-modules via des arguments appropriés --ignore-submodules
, il semble malheureusement qu’il n’ya aucun moyen de le signaler dans le répertoire de travail proprement dit. Si les fichiers non suivis du répertoire de travail sont pertinents, git status --porcelain
c'est probablement le meilleur choix.