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