considere:
$ git --version git version 2.20.1 (Apple Git-117) $ git diff-index --quiet HEAD ; echo $? 1 $ git status > /dev/null $ git diff-index --quiet HEAD ; echo $? 0
Esto es en macos con un sistema de archivos que no distingue entre mayúsculas y minúsculas . (No sé si eso es relevante). En el host donde ocurre esto, hay una imagen de la ventana acoplable que ejecuta debian con el mismo directorio montado, y en la imagen de la ventana acoplable ocurre el comportamiento opuesto:
$ git diff-index --quiet HEAD ; echo $? 0 # At this point, `git status` was invoked outside the docker image $ git --version git version 2.20.1 $ git diff-index --quiet HEAD ; echo $? 1
Para ser claros, la secuencia de comandos que se ejecutan aquí es: git diff-index
en la imagen de la ventana acoplable (devuelve 0), git diff-index
en el host (devuelve 1), git status
en el host, git diff-index
en el host (devuelve 0) , git diff-index
en la imagen de la ventana acoplable (devuelve 1).
Básicamente, si ejecuto git-status
en un entorno, git diff-index
tendrá éxito (devolverá 0) en ese entorno y fallará en el otro. ¿Alguna idea sobre lo que está sucediendo? Esto no es gran cosa, y tengo la sospecha de que el caso la insensibilidad del sistema de archivos tiene la culpa, pero me encantaría una explicación sólida.
Respuesta
He tenido un problema similar con y creo que la causa fue la misma. Esto no necesita involucrar a Docker o sistemas de archivos que no distinguen entre mayúsculas y minúsculas, aunque pueden exacerbar el problema.
Git mantiene un caché de información sobre el contenido de los archivos. Normalmente, esto es transparente y de alto nivel comandos como git status
y git diff
actualizan la caché según sea necesario.
Comandos de nivel inferior como git diff-index
y git diff-files
están diseñados para devolver resultados rápidos pero aproximados. No actualizan la caché. Devuelven 0 si «están seguros de que las cosas que están comparando son idénticas, pero cuando devuelven 1, todo lo que significa es» No soy consciente de que las cosas son idénticas «. Si las entradas de la caché están obsoletas,» Es posible que las cosas sean idénticas pero git diff-xxx
no lo sabe.
No sé exactamente cómo funciona el caché. En su primer experimento, parece que la primera llamada a git diff-index
notó que la entrada de la caché estaba obsoleta y, por lo tanto, devolvió 1 para «No lo sé». Luego, git status
actualizó la caché y la segunda llamada a git diff-index
vio entradas de caché válidas y pudo concluir que los archivos son idénticos. En su segundo experimento, ejecutar git status
fuera del contenedor Docker parece haber creado entradas de caché que git diff-index
dentro del contenedor se considera obsoleto, por lo que la segunda llamada a git diff-index
devolvió 1 para «No lo sé».
Mi solución fue olvidarme de los comandos de bajo nivel y ceñirme a git diff --quiet
.