Le but est d'obtenir un statut sans ambiguïté qui peut être évalué dans une commande shell.
J'ai essayé git status
mais il renvoie toujours 0, même s'il y a des éléments à valider.
git status
echo $? #this is always 0
J'ai une idée mais je pense que c'est plutôt une mauvaise idée.
if [ git status | grep -i -c "[a-z]"> 2 ];
then
code for change...
else
code for nothing change...
fi
d'une autre manière?
mise à jour avec la résolution suivante, voir l'article de Mark Longair
J'ai essayé cela mais cela pose un problème.
if [ -z $(git status --porcelain) ];
then
echo "IT IS CLEAN"
else
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
echo git status
fi
J'obtiens l'erreur suivante [: ??: binary operator expected
maintenant, je regarde l'homme et j'essaye le git diff.
=================== code pour mon espoir, et j'espère mieux répondre =======================
#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ];
then
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
exit 1
else
exit 0
fi
git
git-status
9nix00
la source
la source
$(git status --porcelain)
. De plus, si vous souhaitez mettre des points d'exclamation dans votre message, vous devrez utiliser des guillemets simples plutôt que des guillemets doubles - c'est-à-dire qu'il devrait l'être à laecho 'PLEASE COMMIT YOUR CHANGE FIRST!!!'
place$(git status --porcelain)
, comme je vous l'ai dit!Réponses:
Une alternative au test si la sortie de
git status --porcelain
est vide consiste à tester séparément chaque condition qui vous intéresse. On peut ne pas toujours se soucier, par exemple, s'il y a des fichiers non suivis dans la sortie degit status
.Par exemple, pour voir s'il existe des modifications locales non organisées, vous pouvez consulter le code de retour de:
Pour vérifier s'il y a des modifications qui sont préparées mais non validées, vous pouvez utiliser le code de retour de:
Enfin, si vous voulez savoir s'il existe des fichiers non suivis dans votre arbre de travail qui ne sont pas ignorés, vous pouvez tester si la sortie de la commande suivante est vide:
Mise à jour: Vous demandez ci-dessous si vous pouvez modifier cette commande pour exclure les répertoires de la sortie. Vous pouvez exclure des répertoires vides en ajoutant
--no-empty-directory
, mais pour exclure tous les répertoires de cette sortie, je pense que vous devrez filtrer la sortie, par exemple avec:Le
-v
àegrep
signifie pour afficher uniquement les lignes qui ne correspondent pas au modèle, et le modèle correspond à toute ligne qui se termine par un/
.la source
--quiet
(ce qui implique--exit-code
) fait également taire la sortie, pour ceux qui ne veulent que le code de sortie.La valeur de retour de
git status
vous indique simplement le code de sortie degit status
, pas s'il y a des modifications à valider.Si vous voulez une version plus lisible par ordinateur de la
git status
sortie, essayezVoir la description de
git status
pour plus d'informations à ce sujet.Exemple d'utilisation (le script teste simplement s'il
git status --porcelain
donne une sortie, aucune analyse nécessaire):Veuillez noter que vous devez citer la chaîne à tester, c'est-à-dire la sortie de
git status --porcelain
. Pour plus d'informations sur les constructions de test, reportez-vous au Advanced Bash Scripting Guide (Section comparaison de chaînes ).la source
|| echo no
à la substitution de commande afin que l'espace de travail ne soit pas signalé par erreur propre en cas d'git status
échec fondamental. De plus, votre code est (louable) conforme à POSIX, mais puisque vous créez un lien vers un guide bash, permettez-moi d'ajouter que si vous utilisez bash au[[ ... ]]
lieu de compatible POSIX[ ... ]
, vous n'avez pas besoin de double-guillemet la substitution de commande (même si elle ne fait pas de mal):[[ -z $(git status --porcelain) ]]
.Si vous êtes comme moi, vous voulez savoir s'il y a:
1) les modifications apportées aux fichiers existants 2) les fichiers nouvellement ajoutés 3) les fichiers supprimés
et spécifiquement ne veulent pas connaître 4) les fichiers non suivis.
Cela devrait le faire:
Voici mon code bash pour quitter le script si le dépôt est propre. Il utilise la version courte de l'option des fichiers non suivis:
la source
—untracked-files=no
; Je pense que votre test peut être simplifié[[ -z $(git status --untracked-files=no --porcelain) ]]
.git status
ne devrait pas écrire à stderr, à moins que quelque chose va mal fondamental - et vous ne voulez voir que la production. (Si vous souhaitez un comportement plus robuste dans cet événement, ajoutez|| echo no
à la substitution de commande afin que le test de propreté échoue toujours). Comparaisons de chaînes / l'-z
opérateur peut gérer des chaînes multilignes - pas besoin detail
.[[ -z $(git status -u no --porcelain) ]]
[[ -z $(git status -uno --porcelain) ]]
Il est possible de combiner
git status --porcelain
avec un simplegrep
pour effectuer le test.J'utilise parfois cela comme un simple one-liner:
Ajoutez
-qs
à votre commande grep pour la rendre silencieuse.la source
git status
échouer fatalement (par exemple, un dépôt corrompu), votre test signalera par erreur un espace de travail propre . Une option est d'utilisergit status --porcelain 2>&1
, mais cela «mangerait» le message d'erreur si vous utilisiez grep avec-q
. (Faire face à qui perdre l'élégance:(git status --porcelain || echo err) | grep -q .
)test -z "$(git status --porcelain)" || git pull origin master
À partir du code source de git, il existe un script sh qui comprend les éléments suivants.
Ce sniplet montre comment il est possible d'utiliser
git diff-files
etgit diff-index
de savoir s'il y a des modifications aux fichiers précédemment connus. Il ne vous permet cependant pas de savoir si un nouveau fichier inconnu a été ajouté à l'arborescence de travail.la source
if [ -n "$(git ls-files --others --exclude-standard)" ]
sans aucun piping ou greping supplémentaire devrait être suffisant pour détecter les fichiers non suivis.je ferais un test sur ceci:
ou ceci pour être explicite:
où:
--exit-code
Faites quitter le programme avec des codes similaires à diff (1). Autrement dit, il sort avec 1 s'il y avait des différences et 0 signifie aucune différence.
--silencieux
Désactivez toutes les sorties du programme. Implique --exit-code
la source
Je suis un peu en retard dans la discussion, mais si c'est seulement que vous devez avoir un code de sortie de 0 si
git status --porcelain
rien ne retourne et! = 0 sinon, essayez ceci:Cela fera du nombre de lignes le code de sortie, au risque d'avoir des problèmes quand il y a plus de 255 lignes. Alors
en rendra compte;)
la source
J'utilise ceci dans un script pour avoir:
1 quand il y a un diff ou des fichiers non suivis
[-z "$ (git status --porcelain)"]
la source
if ! git diff --quiet; then
est plus propre et plus performante (je pense). En d'autres termes, utilisez le code de sortie, pas la sortie standard.git diff --quiet
se comporte différemment desgit status --porcelain
modifications mises en cache.Pas joli, mais fonctionne:
Je ne sais pas si le message dépend de la langue, alors peut-être mettre un
LANG=C
devant.la source