J'ai un script qui s'exécute rsync
avec un répertoire de travail Git comme destination. Je veux que le script ait un comportement différent selon que le répertoire de travail est propre (aucune modification à valider) ou non. Par exemple, si le résultat de git status
est comme ci-dessous, je veux que le script se ferme:
git status
Already up-to-date.
# On branch master
nothing to commit (working directory clean)
Everything up-to-date
Si le répertoire n'est pas propre, j'aimerais qu'il exécute quelques commandes supplémentaires.
Comment puis-je vérifier la sortie comme ci-dessus dans un script shell?
shell-script
git
Brentwpeterson
la source
la source
git reset --hard origin/branch
si si c'est ce que vous allez ... comme si vous essayez de nettoyer après avoir compilé quelque chose, etc.Réponses:
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 quigit 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: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:Pour rendre plus robuste contre les conditions qui en fait l' origine
git status
à l' échec sans sortiestdout
, nous pouvons affiner le chèque à: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 statut1
lorsqu'il y avait des différences et0
aucun.En utilisant cela, nous pouvons vérifier les modifications non mises en scène avec:
et mis en scène, mais pas commis des changements avec:
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.la source
git status --porcelain
se fermera avec le code 0 même s'il y a des modifications non mises en scène pour les fichiers commit et non suivis.git stash
ferait quoi que ce soit (il ne génère pas de code retour utile). Je devais ajouter--ignore-submodules
car sinongit status
indiquerait des modifications de sous-modules quigit stash
ignorent.if [ -z
passait. Les-z
moyens que si la chaîne suivante est vide, le cas évalue àtrue
. En d'autres termes, si cela negit status --porcelain
donne aucune chaîne, le référentiel est propre. Sinon, il répertorie les fichiers modifiés / ajoutés / supprimés et n'est plus une chaîne vide. Leif
alors évalue àfalse
.Utilisation:
Le code de retour reflète l'état du répertoire de travail (0 = propre, 1 = sale). Les fichiers non suivis sont ignorés.
la source
git update-index --refresh
avantgit diff-index HEAD
. Plus d'infos: stackoverflow.com/q/34807971/1407170git add .
avant de le publier. Habituellement, c'est la façon de l'utiliser dans un scriptset +e
un appel avant l'appelgit
et en ajoutant deset -e
nouveau après l'évaluation$?
.Extension mineure de l' excellente réponse d' André .
C'est un moyen d'évaluer les résultats et d'éviter un piège si vous êtes dans un script qui a précédemment publié set -e .
Les fichiers non suivis sont ignorés.
la source