ATUALIZAÇÃO : o OP Daniel Stutzbach ressalta nos comentários que esse comando simples git diff-indexfuncionou para ele:
git update-index --refresh
git diff-index --quiet HEAD --
( nornagon menciona nos comentários que, se houver arquivos que foram tocados, mas cujo conteúdo é o mesmo do índice, você precisará executar git update-index --refreshantes git diff-index, caso contrário diff-index, informará incorretamente que a árvore está suja)
Você pode ver " Como verificar se um comando foi bem-sucedido? " Se você o estiver usando em um script bash:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
Nota: como comentado por Anthony Sottile
git diff-index HEAD ...falhará em uma ramificação que não possui confirmações (como um repositório recém-inicializado).
Uma solução alternativa que encontrei égit diff-index $(git write-tree) ...
E haridsvressalta nos comentários que git diff-filesem um novo arquivo não o detecta como um diff.
A abordagem mais segura parece ser executada git addprimeiro nas especificações do arquivo e depois usada git diff-indexpara verificar se alguma coisa foi adicionada ao índice antes da execução git commit.
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
E 6502 relata nos comentários:
Um problema que encontrei é que git diff-indexdirá que existem diferenças quando, na verdade, não há nenhuma, exceto os registros de data e hora dos arquivos.
A execução git diffresolve o problema (surpreendentemente, git diffna verdade, altera o conteúdo da sandbox, ou seja, aqui .git/index)
Esses problemas de carimbo de data e hora também podem ocorrer se o git estiver sendo executado na janela de encaixe .
Resposta original:
"Programaticamente" significa nunca confiar em comandos de porcelana .
Sempre confie nos comandos de encanamento .
Consulte também " Verificando se há um índice sujo ou arquivos não rastreados com o Git " para obter alternativas (como git status --porcelain)
Você pode se inspirar na nova " require_clean_work_treefunção " que está escrita enquanto falamos ;) (início de outubro de 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
}