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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *