update - push tag to branch git




Comment puis-je vérifier dans un script Bash si mon référentiel Git local a des modifications? (6)

Ce que vous faites fonctionnera presque: vous devez indiquer $CHANGED au cas où il est vide, et -z teste vide, ce qui signifie qu'il n'y a pas de changement. Ce que vous vouliez dire était:

if [ -n "$CHANGED" ]; then
    VN="$VN-mod"
fi

Une citation du GIT-VERSION-GEN de Git:

git update-index -q --refresh
test -z "$(git diff-index --name-only HEAD --)" ||
VN="$VN-dirty"

On dirait que vous copiez cela, mais vous avez juste oublié ce détail de la citation.

Bien sûr, vous pouvez aussi faire ceci:

if git diff-index --quiet HEAD --; then
    # No changes
else
    # Changes
fi

Ou si vous vous souciez seulement du cas "quelque chose a changé":

if ! git diff-index --quiet HEAD --; then
    VN="$VN-mod"
fi

L'utilisation de --quiet a l'avantage que Git peut arrêter le traitement dès qu'il rencontre un seul diff, il peut donc ne pas avoir à vérifier l'ensemble de votre arbre de travail.

Certains scripts ne fonctionnent pas correctement s'ils vérifient les modifications.

Je l'ai essayé comme ça:

VN=$(git describe --abbrev=7 HEAD 2>/dev/null)

git update-index -q --refresh
CHANGED=$(git diff-index --name-only HEAD --)
if [ ! -z $CHANGED ];
    then VN="$VN-mod"
fi

Existe-t-il une sorte de vérification booléenne s'il y a eu des changements depuis la dernière validation, ou comment puis-je vraiment tester s'il y a de nouveaux changements dans mon dépôt local?

Je fais tout ça pour un script de création de version (que j'ai trouvé quelque part ici).


Cela fonctionne bien. Il répertoriera également les fichiers affectés:

if git diff-index --name-status --exit-code HEAD;
then
    echo Git working copy is clean...;
else
    echo ;
    echo ERROR: Git working copy is dirty!;
    echo Commit your changes and try again.;
fi;

J'ai eu un problème similaire, mais j'ai aussi dû vérifier les fichiers ajoutés. J'ai donc fait ce qui suit:

cd /local/repo
RUN=0
git diff --no-ext-diff --quiet --exit-code || RUN=1
if [ $RUN = 0 ]; then
    RUN=`git ls-files --exclude-standard --others| wc -l`
fi

if [ $RUN = 0 ]; then
    exit 0
fi

Voici comment je le fais ...

CHANGES=`git status | grep "working directory clean"`
if [ ! CHANGES -eq "" ] then
    # do stuff here
else
    echo "You have uncommitted changes..."
fi

Bien que la réponse de Jefromi soit bonne, je poste ceci juste pour référence.

À partir du code source de Git, il y a un script sh qui inclut ce qui suit.

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
}

git status est votre ami

Passez au répertoire Git pour que l' git status fonctionne:

cd c:/path/to/.git

Définissez une variable pour définir l'arborescence de travail afin de ne pas obtenir l'erreur "Cette opération doit être exécutée dans un arbre de travail":

WORKTREE=c:/path/to/worktree

Capture la sortie de l' git status dans une variable Bash

Utilisez --porcelain qui garantit d'être dans un format standard et parsable:

CHANGED=$(git --work-tree=${WORKTREE} status --porcelain)

Si -n (non nul), nous avons des changements.

if [ -n "${CHANGED}" ]; then
  echo 'changed';

else
  echo 'not changed';
fi




git