web-dev-qa-db-fra.com

Comment vérifier s'il n'y a rien à engager dans la branche actuelle?

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
158
9nix00

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 /.

195
Mark Longair

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 ).

101
eckes

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 $$;
29
moodboom

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.

8
Steve Prentice

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.

5
Arrowmaster

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

4
archf

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…

2
Skeeve

J'utilise ceci dans un script pour avoir:

  • 0 quand tout est propre
  • 1 quand il y a un diff ou des fichiers non suivis

    [-z "$ (statut git --porcelaine)"]

1
grosser

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.

0
Tilman Vogel