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)

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


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.


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