AGGIORNAMENTO : l'OP Daniel Stutzbach sottolinea nei commenti che questo semplice comando ha git diff-index
funzionato 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 --refresh
prima git diff-index
, altrimenti diff-index
segnalerai 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 haridsv
sottolinea nei commenti che git diff-files
su un nuovo file non lo rileva come diff.
L'approccio più sicuro sembra essere quello di eseguire git add
prima le specifiche del file e quindi utilizzare git diff-index
per 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-index
dirà che ci sono differenze quando in effetti non ce ne sono, tranne che per i timestamp dei file.
Eseguire git diff
una volta risolto il problema (abbastanza sorprendentemente, in git diff
realtà 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_tree
funzione " 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
}