Certains scripts ne fonctionnent pas correctement s'ils vérifient les modifications.
Je l'ai essayé comme ceci:
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 le dernier commit, ou comment puis-je vraiment tester s'il y a de nouveaux changements dans mon référentiel local?
Je fais tout cela pour un script de création de version (que j'ai trouvé quelque part ici).
git status
?Réponses:
Ce que vous faites fonctionnera presque: vous devriez citer
$CHANGED
au cas où il serait vide et-z
tester pour vide, ce qui signifie qu'aucun changement. Vous vouliez dire:Une citation de Git's
GIT-VERSION-GEN
:On dirait que vous copiez cela, mais vous avez simplement oublié ce détail de la citation.
Bien sûr, vous pouvez également faire ceci:
Ou si vous ne vous souciez que du cas "quelque chose a changé":
L'utilisation
--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'intégralité de votre arbre de travail.la source
git diff --no-ext-diff --quiet --exit-code
pour déterminer l'état sale.--no-ext-diff
option est bonne pour la sécurité (au cas où quelqu'un a configuré un pilote de différence externe), bien que cela--exit-code
ne devrait pas être nécessaire, car cela est impliqué par--quiet
.git diff-index
signale les modifications même si seules les heures de modification des fichiers ont changé (et non leur contenu). Si vous aveztouch
un fichier, il signalera une modification quigit status
sera réinitialisée. Utilisergit status
comme ci-dessous est mieux.Utilisation
git status
:la source
git status --porcelain --untracked-files=no
]]; puisif [[ $(git status --porcelain | wc -l) -gt 0 ]]; then echo CHANGED else echo NOT CHANGED locally fi
git status --porcelain
voir si la sortie n'est pas vide. Si c'est le cas, cela signifie qu'il y a des changements.Bien que la réponse de Jefromi soit bonne, je publie ceci juste pour référence.
À partir du code source de Git, il existe un
sh
script qui comprend les éléments suivants.la source
$1
est une chaîne nommant une tâche que vous souhaitez exécuter et$2
est une chaîne contenant éventuellement un message d'erreur personnalisé en cas d'échec. Par exemple, appelez-le commerequire_clean_work_tree deploy "Skipping deploy, clean up your work tree or run dev-push"
J'ai eu un problème similaire, mais j'ai également dû vérifier les fichiers ajoutés. J'ai donc fait ce qui suit:
la source
git status
est votre amiAccédez au répertoire Git pour
git status
travailler:Définissez une variable pour définir l'arborescence de travail afin que vous n'obteniez pas l'erreur `` Cette opération doit être exécutée dans un arbre de travail '':
Capturer la
git status
sortie dans une variable BashUtilisez
--porcelain
qui garantit d'être dans un format standard et analysable:Si -n (non nul), nous avons des changements.
la source
Cela fonctionne aussi:
la source
Cela fonctionne bien. Il listera également les fichiers concernés:
la source
git diff --no-ext-diff --quiet --exit-code
également le travail.Voici un bel ensemble de fonctions de script Bash qui vérifient s'il existe un diff, l'imprime à l'utilisateur et lui demande s'il souhaite valider les modifications avant le déploiement. Il est conçu pour une application Heroku et Python, mais il ne nécessite que peu de modifications pour toute autre application.
Vous pouvez copier à partir de Gists sur: https://gist.github.com/sshadmand/f33afe7c9071bb725105
la source
La question du PO a plus de 9 ans maintenant. Je ne sais pas ce qui a été
man git-status
dit alors, mais voici ce qu'il dit maintenant:Cela suggère que l'
--porcelain
argument est bien adapté pour tester l'état d'un dépôt pour les modifications.Répondez à la question de l'OP, "Y a-t-il une sorte de vérification booléenne s'il y a eu des changements depuis le dernier commit, ou comment puis-je vraiment tester s'il y a de nouveaux changements dans mon référentiel local?"
Je ne pense pas que cela
bash
ait des types de données booléens en soi , mais cela peut être assez proche:Cela peut être reconstitué en tant que
if-then-else
formulaire pour un script, ou exécuté tel quel par l'interface de ligne de commande dans le dossier git repo . Sinon, utilisez l'-C
option avec une spécification de chemin vers le dépôt d'intérêt:Addenda:
-u, --untracked-file
option pour éviter de signaler l'état des fichiers que l'on souhaite ignorer. Notez que cela a un effet secondaire malheureux : les fichiers nouvellement ajoutés ne sont pas non plus classés. L'option est utile dans certaines situations , mais considérez-la attentivement avant de l'utiliser.la source
Voici comment je fais ...
la source
collez ceci
courir
sh checker_git.sh gitpath
la source
Basé sur le commentaire de @ storm_m2138 sur la réponse de @ RyanMoon ( lien ), j'utilise ce qui suit dans
Powershell
.la source