L'objectif est d'obtenir un statut non ambigu qui puisse ê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 le message 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
Je reçois l'erreur suivante [: ??: binary operator expected
maintenant, je regarde l'homme et essaie le git diff.
================== Code pour mon espoir, et j'espère une meilleure réponse =====================
#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
Une alternative à tester si la sortie de git status --porcelain
est vide, vous devez tester chaque condition séparément. On ne se soucie pas toujours, par exemple, s’il ya des fichiers non suivis dans la sortie de git status
.
Par exemple, pour voir s’il existe des modifications locales non mises en scène, vous pouvez consulter le code de retour de:
git diff --exit-code
Pour vérifier si des modifications sont en cours mais non validées, vous pouvez utiliser le code de retour de:
git diff --cached --exit-code
Enfin, si vous souhaitez savoir s'il existe des fichiers non suivis dans votre arbre de travail qui ne sont pas ignorés, vous pouvez tester si le résultat de la commande suivante est vide:
git ls-files --other --exclude-standard --directory
pdate: 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, comme avec:
git ls-files --other --exclude-standard --directory | egrep -v '/$'
Le -v
à egrep
signifie que seules les lignes en sortie qui ne correspondent pas au modèle sont affichées, et le modèle correspond à toute ligne se terminant par un /
.
La valeur de retour de git status
vous indique simplement le code de sortie de git status
, pas s'il y a des modifications à valider.
Si vous voulez une version plus lisible par ordinateur du git status
sortie, essayez
git status --porcelain
Voir la description de git status
pour plus d'informations à ce sujet.
Exemple d'utilisation (le script teste simplement si git status --porcelain
donne une sortie, aucune analyse n’est nécessaire):
if [ -n "$(git status --porcelain)" ]; then
echo "there are changes";
else
echo "no changes";
fi
Veuillez noter que vous devez citer la chaîne à tester, c’est-à-dire le résultat de git status --porcelain
. Pour plus de conseils sur les constructions de test, reportez-vous à la comparaison de chaînes Guide de script Bash avancé (Section ).
Si vous êtes comme moi, vous voulez savoir s'il y a:
1) modifications apportées aux fichiers existants 2) nouveaux fichiers ajoutés 3) fichiers supprimés
et spécifiquement ne veulent pas savoir sur 4) les fichiers non suivis.
Cela devrait le faire:
git status --untracked-files=no --porcelain
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:
[[ -z $(git status -uno --porcelain) ]] && echo "this branch is clean, no need to Push..." && kill -SIGINT $$;
Il est possible de combiner git status --porcelain
avec un simple grep
pour effectuer le test.
if git status --porcelain | grep .; then
echo Repo is dirty
else
echo Repo is clean
fi
J'utilise parfois cela comme une simple ligne:
# pull from Origin if our repo is clean
git status --porcelain | grep . || git pull Origin master
Ajouter -qs
à votre commande grep pour la rendre silencieuse.
Le code source de git contient un script sh qui inclut les éléments suivants.
require_clean_work_tree () {
git rev-parse --verify HEAD >/dev/null || exit 1
git update-index -q --ignore-submodules --refresh
err=0
if ! git diff-files --quiet --ignore-submodules
then
echo >&2 "Cannot $1: You have unstaged changes."
err=1
fi
if ! git diff-index --cached --quiet --ignore-submodules HEAD --
then
if [ $err = 0 ]
then
echo >&2 "Cannot $1: Your index contains uncommitted changes."
else
echo >&2 "Additionally, your index contains uncommitted changes."
fi
err=1
fi
if [ $err = 1 ]
then
test -n "$2" && echo >&2 "$2"
exit 1
fi
}
Ce sniplet montre comment il est possible d'utiliser git diff-files
et git diff-index
pour savoir si des modifications ont déjà été apportées aux fichiers connus. Toutefois, cela ne vous permet pas de savoir si un nouveau fichier inconnu a été ajouté à l’arbre de travail.
je ferais un test sur ceci:
git diff --quiet --cached
ou ceci pour être explicite:
git diff --quiet --exit-code --cached
où:
- code de sortie
Faites sortir le programme avec des codes similaires à diff (1). Autrement dit, il existe avec 1 s'il y avait des différences et 0 signifie qu'il n'y a pas de différences.
- calme
Désactiver toutes les sorties du programme. Implique --exit-code
Je suis un peu en retard dans la discussion, mais si c'est seulement que vous avez besoin d'un code de sortie de 0 si git status --porcelain
ne renvoie rien et! = 0 sinon, essayez ceci:
exit $( git status --porcelain | wc -l )
Cela fera du nombre de lignes le code de sortie…
J'utilise ceci dans un script pour avoir:
1 quand il y a un diff ou des fichiers non suivis
[-z "$ (statut git --porcelaine)"]
Pas joli, mais ça marche:
git status | grep -qF 'working directory clean' || echo "DIRTY"
Vous ne savez pas si le message dépend des paramètres régionaux, alors mettez peut-être un LANG=C
devant.