ACTUALIZACIÓN : el OP Daniel Stutzbach señala en los comentarios que este simple comando git diff-indexfuncionó para él:
git update-index --refresh
git diff-index --quiet HEAD --
( Nornagon menciona en los comentarios que, si hay archivos que se han tocado, pero cuyo contenido es el mismo que en el índice, deberá ejecutarlo git update-index --refreshantes git diff-index; de lo contrario diff-index, informará incorrectamente que el árbol está sucio)
Luego puede ver " ¿Cómo verificar si un comando tuvo éxito? " Si lo está utilizando en un script bash:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
Nota: como se ha comentado por Anthony Sottile
git diff-index HEAD ...fallará en una rama que no tiene confirmaciones (como un repositorio recién inicializado).
Una solución que he encontrado esgit diff-index $(git write-tree) ...
Y haridsvseñala en los comentarios que git diff-filesen un nuevo archivo no lo detecta como una diferencia.
El enfoque más seguro parece ser ejecutar git addprimero en la especificación del archivo y luego usar git diff-indexpara ver si se agregó algo al índice antes de ejecutarse git commit.
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
Y 6502 informes en los comentarios:
Un problema con el que me topé es que git diff-indexdirá que hay diferencias cuando de hecho no hay ninguna, excepto las marcas de tiempo de los archivos.
Ejecutar git diffuna vez resuelve el problema (sorprendentemente, en git diffrealidad cambia el contenido del sandbox, lo que significa aquí .git/index)
Estos problemas de marca de tiempo también pueden ocurrir si git se está ejecutando en Docker .
Respuesta original:
"Programáticamente" significa nunca confiar en los comandos de porcelana .
Siempre confíe en los comandos de plomería .
Consulte también " Verificación de un índice sucio o archivos sin seguimiento con Git " para alternativas (como git status --porcelain)
Puede inspirarse en la nueva " require_clean_work_treefunción " que está escrita mientras hablamos ;) (principios de octubre 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
}