281 votes

Comment vérifier si il n'y a rien à être engagé dans la branche?

tous les. comment pouvons-nous obtenir le résultat d'état dans le shell? J'ai essayé d' git status , mais il retourne toujours 0, même si nous avons commis.

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,et maintenant ce résoudre à voir la Marque de Longair 'post

J'ai essayé ceci , mais à cause d'un problème.

if [ -z $(git status --porcelain) ];
then
    echo "IT IS CLEAN"
else
    echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
    echo git status
fi

lorsque l'

il obtiendra une erreur , [: ??: opérateur binaire prévu

maintenant , je suis à la recherche de l'homme et essayer de le git diff.

===================code pour mon espoir, et l'espoir de 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

331voto

Mark Longair Points 93104

Une alternative à tester si la sortie de l' git status --porcelain est vide est de tester chaque condition que vous vous souciez d'séparément. On peut n'être pas toujours de soins, par exemple, s'il y a sans traces des fichiers de sortie de l' git status.

Par exemple, pour voir s'il y a des locaux unstaged changements, vous pouvez regarder le code de retour de:

git diff --exit-code

Pour vérifier s'il y a des changements qui sont mis en scène, mais pas commis, vous pouvez utiliser le code de retour de:

git diff --cached --exit-code

Enfin, si vous voulez savoir à propos de l'existence de tout sans traces des fichiers 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

Mise à jour: Vous demandez-dessous si vous pouvez modifier la commande d'exclure les répertoires dans la sortie. Vous pouvez exclure des répertoires vides par l'ajout d' --no-empty-directory, mais d'exclure tous les répertoires dans cette sortie, je pense que vous aurez pour filtrer la sortie, telles que:

git ls-files --other --exclude-standard --directory | egrep -v '/$'

L' -v de egrep moyen de sortie seulement les lignes qui ne correspondent pas au modèle, et le modèle correspond à une ligne qui se termine par un /.

197voto

eckes Points 17277

La valeur de retour de l' git status vous indique juste que le code de sortie git status, pas si il y a des modifications à être commis.

Si vous voulez un plus lisible par ordinateur de la version de l' git status de sortie, essayez

git status --porcelain

Voir la description de l' git status pour plus d'informations à ce sujet.

Exemple d'utilisation (script simplement des tests, si git status --porcelain donne aucune sortie, aucune analyse 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 de test, c'est à dire la sortie de l' git status --porcelain. Pour plus de conseils sur les constructions, reportez-vous à la Advanced Bash Scripting Guide (Section de comparaison de chaîne).

47voto

moodboom Points 661

Si vous êtes comme moi, vous voulez savoir si il y a:

1) des changements à des fichiers existants 2) les fichiers ajoutés récemment 3) les fichiers supprimés

et plus précisément ne voulez pas savoir sur 4) sans traces de fichiers.

Cela devrait le faire:

git status --untracked-files=no --porcelain

Voici mon code bash pour quitter le script si le repo est propre:

[[ $(git status --untracked-files=no --porcelain 2> /dev/null | tail -n1) = "" ]] && echo "this branch is clean, no need to push..." && kill -SIGINT $$;

10voto

Steve Prentice Points 7638

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

- Je l'utiliser comme un simple one-liner parfois:

# pull from origin if our repo is clean
git status --porcelain | grep . || git pull origin master

Ajouter -qs de votre commande grep pour le rendre silencieux.

6voto

Arrowmaster Points 4268

À partir du code source de git il y a un script sh qui comprend 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
}

Cette sniplet montre comment il est possible d'utiliser git diff-files et git diff-index pour savoir si il y a des changements à déjà connu des fichiers. Il ne vous permet pas de savoir si un nouveau fichier inconnu a été ajouté à l'arbre de travail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X