AGGIORNAMENTO : l'OP Daniel Stutzbach sottolinea nei commenti che questo semplice comando ha git diff-indexfunzionato per lui:
git update-index --refresh
git diff-index --quiet HEAD --
( nornagon menziona nei commenti che, se ci sono file che sono stati toccati, ma i cui contenuti sono gli stessi dell'indice, dovrai eseguirli git update-index --refreshprima git diff-index, altrimenti diff-indexsegnalerai erroneamente che l'albero è sporco)
Puoi quindi vedere " Come verificare se un comando è riuscito? " Se lo stai usando in uno script bash:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
Nota: come commentato da Anthony Sottile
git diff-index HEAD ...fallirà su un ramo che non ha commit (come un repository appena inizializzato).
Una soluzione alternativa che ho trovato ègit diff-index $(git write-tree) ...
E haridsvsottolinea nei commenti che git diff-filessu un nuovo file non lo rileva come diff.
L'approccio più sicuro sembra essere quello di eseguire git addprima le specifiche del file e quindi utilizzare git diff-indexper vedere se qualcosa è stato aggiunto all'indice prima di essere eseguito git commit.
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
E 6502 rapporti nei commenti:
Un problema in cui mi sono imbattuto è che git diff-indexdirà che ci sono differenze quando in effetti non ce ne sono, tranne che per i timestamp dei file.
Eseguire git diffuna volta risolto il problema (abbastanza sorprendentemente, in git diffrealtà cambia il contenuto del sandbox, nel senso qui .git/index)
Questi problemi di data e ora possono anche verificarsi se git è in esecuzione nella finestra mobile .
Risposta originale:
"Programmaticamente" significa che mai e poi mai fare affidamento sui comandi di porcellana .
Affidati sempre ai comandi idraulici .
Vedi anche " Verifica di un indice sporco o file non tracciati con Git " per alternative (come git status --porcelain)
Puoi prendere ispirazione dalla nuova " require_clean_work_treefunzione " che è scritta mentre parliamo ;) (inizio ottobre 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
}