Dans un Makefile, j'aimerais effectuer certaines actions s'il y a des modifications non validées (soit dans l'arborescence de travail soit dans l'index). Quelle est la façon la plus propre et la plus efficace de le faire? Une commande qui se termine avec une valeur de retour de zéro dans un cas et non nulle dans l'autre conviendrait à mes fins.
Je peux exécuter git status
et diriger la sortie grep
, mais je pense qu'il doit y avoir un meilleur moyen.
Réponses:
MISE À JOUR : l'OP Daniel Stutzbach souligne dans les commentaires que cette simple commande a
git diff-index
fonctionné pour lui:( Nornagon mentionne dans les commentaires que, s'il y a des fichiers qui ont été touchés, mais dont le contenu est le même que dans l'index, vous devrez exécuter
git update-index --refresh
avantgit diff-index
, sinon vousdiff-index
rapporterez à tort que l'arborescence est sale)Vous pouvez alors voir " Comment vérifier si une commande a réussi? " Si vous l'utilisez dans un script bash:
Note: comme commenté par Anthony Sottile
Et
haridsv
souligne dans les commentaires quegit diff-files
sur un nouveau fichier ne le détecte pas comme un diff.L'approche la plus sûre semble être d'exécuter
git add
d'abord la spécification de fichier, puis de l'utilisergit diff-index
pour voir si quelque chose a été ajouté à l'index avant de s'exécutergit commit
.Et 6502 rapports dans les commentaires:
Ces problèmes d'horodatage peuvent également se produire si git s'exécute dans docker .
Réponse originale:
"Par programme" signifie ne jamais se fier aux commandes en porcelaine .
Comptez toujours sur les commandes de plomberie .
Voir aussi " Recherche d'un index sale ou de fichiers non suivis avec Git " pour des alternatives (comme
git status --porcelain
)Vous pouvez vous inspirer de la nouvelle "
require_clean_work_tree
fonction " qui s'écrit au moment où nous parlons ;) (début octobre 2010)la source
git diff-index --quiet HEAD
.HEAD
dans le répertoire de travail. Meilleure utilisationgit diff-index --quiet HEAD --
.git status --help
états: --porcelain Donne la sortie dans un format facile à analyser pour les scripts. Ceci est similaire à la sortie courte, mais restera stable dans toutes les versions de Git et quelle que soit la configuration de l'utilisateur. Voir ci-dessous pour plus de détails.Bien que les autres solutions soient très approfondies, si vous voulez quelque chose de vraiment rapide et sale, essayez quelque chose comme ceci:
Il vérifie simplement s'il y a une sortie dans le résumé d'état.
la source
[[ ... ]]
fait réellement la syntaxe? Je n'ai jamais rien vu de tel auparavant.git status
est en fait ignoré dans ce test. Il ne regarde que la sortie. Consultez cette page correspondante bash pour plus d' informations sur[
,[[
et comment fonctionne le test en bash.--porcelain
paramètre comme indiqué icigit status -s -uall
pour inclure des fichiers non suivis.git diff --exit-code
retournera différent de zéro s'il y a des changements;git diff --quiet
est le même sans sortie. Puisque vous voulez vérifier l'arborescence de travail et l'index, utilisezOu
L'un ou l'autre vous dira s'il y a des changements non validés qui sont par étapes ou non.
la source
git diff --quite HEAD
unique vous indiquera uniquement si l'arborescence de travail est propre, pas si l'index est propre. Par exemple, si afile
été changé entre HEAD ~ et HEAD, puis aprèsgit reset HEAD~ -- file
, il quittera toujours 0 même s'il y a des changements par étapes présents dans l'index (wt == HEAD, mais index! = HEAD).git diff --quiet && git diff --cached --quiet
.Développer la réponse de @ Nepthar:
la source
$(git status -s "$file")
else
git add "$file"; git commit -m "your autocommit process" "$file"
git status -s
unegit status --porcelain ; git clean -nd
place, les répertoires junk seront ici aussi refait surface, qui sont invisibles àgit status
.Comme indiqué dans d'autres réponses, aussi simple qu'une telle commande suffit:
Si vous omettez les deux derniers tirets, la commande échouera si vous avez un fichier nommé
HEAD
.Exemple:
Attention: cette commande ignore les fichiers non suivis.
la source
git add
etgit clean
à la rescousseJ'ai créé des alias git pratiques pour répertorier les fichiers non et les fichiers intermédiaires:
Ensuite, vous pouvez facilement faire des choses comme:
Vous pouvez le rendre plus lisible en créant un script quelque part sur votre
PATH
appelégit-has
:Maintenant, les exemples ci-dessus peuvent être simplifiés pour:
Pour être complet, voici des alias similaires pour les fichiers non suivis et ignorés:
la source
Avec python et le package GitPython:
Renvoie True si le référentiel n'est pas propre
la source
LOGLEVEL=DEBUG
vous verrez toutes les commandes Popen qu'il utilise pour exécutergit diff
Voici le meilleur moyen, le plus propre.
la source
git status
est une commande «porcelaine». N'utilisez pas les commandes porcelain dans les scripts car elles peuvent changer entre les versions de git. Utilisez plutôt des commandes de plomberie.git status --porcelain
(ce qui est destiné à cet effet - un format stable que vous pouvez analyser dans un script), peut-être aussi avec -z (séparé par zéro au lieu de la nouvelle ligne?), Vous pourriez faire quelque chose d'utile avec cette idée . @ codyc4321 voir stackoverflow.com/questions/6976473/… pour plus de détails