UPDATE : l'OP Daniel Stutzbach souligne dans les commentaires que cette simple commande git diff-index
a travaillé pour lui :
git update-index --refresh
git diff-index --quiet HEAD --
Une option plus précise serait de tester git status --porcelain=v1 2>/dev/null | wc -l
en utilisant le porcelain
option .
Voir Myridium 's réponse .
( 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
avant git diff-index
sinon diff-index
signalera à tort que l'arbre est sale)
Vous pouvez alors voir " Comment vérifier si une commande a réussi ? " si vous l'utilisez dans un script bash :
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
Note : comme a commenté par Anthony Sottile
git diff-index HEAD ...
échouera sur une branche qui n'a pas de commits (comme un dépôt nouvellement initialisé).
Une solution que j'ai trouvée est git diff-index $(git write-tree) ...
Et haridsv
souligne dans les commentaires que git diff-files
sur un nouveau ne le détecte pas comme un diff.
L'approche la plus sûre semble être d'exécuter git add
sur la spécification du fichier d'abord et ensuite utiliser git diff-index
pour voir si quelque chose a été ajouté à l'index avant de lancer git commit
.
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
Et 6502 dans les commentaires :
Un problème auquel je me suis heurté est que git diff-index
dira qu'il y a des différences alors qu'il n'y en a aucune, sauf pour les horodatages des fichiers.
Running git diff
une fois résout le problème (de manière assez surprenante, git diff
modifie effectivement le contenu de la sandbox, ce qui signifie qu'ici .git/index
)
Ces problèmes d'horodatage peuvent également se produire si git est exécuté dans un docker .
Réponse originale :
"Par programme", on entend ne comptez jamais sur commandes en porcelaine .
Faites toujours confiance à commandes de plomberie .
Voir aussi " Vérification d'un index sale ou de fichiers non suivis avec Git " pour les alternatives (comme git status --porcelain
)
Vous pouvez vous inspirer du nouveau " require_clean_work_tree
fonction "qui est écrit au moment où nous parlons ;) (début octobre 2010)
require_clean_work_tree () {
# Update the index
git update-index -q --ignore-submodules --refresh
err=0
# Disallow unstaged changes in the working tree
if ! git diff-files --quiet --ignore-submodules --
then
echo >&2 "cannot $1: you have unstaged changes."
git diff-files --name-status -r --ignore-submodules -- >&2
err=1
fi
# Disallow uncommitted changes in the index
if ! git diff-index --cached --quiet HEAD --ignore-submodules --
then
echo >&2 "cannot $1: your index contains uncommitted changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1
fi
if [ $err = 1 ]
then
echo >&2 "Please commit or stash them."
exit 1
fi
}
6 votes
Duplicata possible de Vérification d'un index sale ou de fichiers non suivis avec Git