2009-12-31 8 views

Respuesta

3

Usted tendrá que asegurarse de que tanto las dos propiedades siguientes se cumplen:

  1. que no hay diferencias entre la cabeza y la caché del índice

    git diff-index --cached HEAD

  2. Que hay no hay diferencias entre el índice y el árbol de trabajo:

    git diff-files

Ambos comandos toman un parámetro --quiet que establecerá el código de salida en función de si hay diferencias o no (a partir de algún tiempo después de git 1,4). Si necesita hacer que funcione en git 1.4, debe ejecutar los comandos sin --quiet y comprobar si producen alguna salida.

Nota:git diff es un comando de porcelana y, por lo tanto, no debe utilizarse en scripts. Use los comandos de plomería anteriores en su lugar.

código shell Ejemplo, tomado de mi git_version.sh script:

git_dirty=yes 
# git-1.4 does not understand "git-diff-files --quiet" 
# git-1.4 does not understand "git-diff-index --cached --quiet HEAD" 
if [ "x$($GIT diff-files)" = "x" ] && [ "x$($GIT diff-index --cached HEAD)" = "x" ]; then 
    git_dirty=no 
fi 

Si puede requerir una versión git> = 1,5, if git diff-files --quiet && git diff-index --quiet --cached HEAD; then puede reemplazar por encima de la comparación.

Nota: Esta solución (exactamente igual de Antony interactiva git diff HEAD --quiet) sólo se descubre cambios locales en relación con HEAD. Sin embargo, los compromisos locales también pueden considerarse cambios locales y, naturalmente, no se mostrarán en ningún diff contra HEAD. Deberá verificar el valor de SHA1 git describe para detectar si HEAD pertenece a un conjunto de confirmaciones que considera que no son cambios locales.

+0

Ver también mis comentarios en http://stackoverflow.com/questions/1985301/how-to-make-git-describe-mention-the-presence-or-absence-of-local-changes/1985431#1985431 –

0

git status sale con un estado distinto de cero si no hay cambios locales.

Pero no entiendo lo que quiere decir "en combinación con git describe".

+0

v1.1-5-g1234567 significaría no hay cambios locales y v1.1-5-g1234567 (+) que significaría con cambios locales El estado de git retornó 1 aquí cuando hubo cambios locales no registrados –

1

git diff --quiet devuelve con estado de salida 1 si hay cambios y 0 si no lo hay.

Tenga en cuenta que mostrará diferencias entre los cambios en etapas y el directorio de trabajo. Si le interesan los cambios entre su HEAD y el directorio de trabajo, debe usar git diff HEAD --quiet.

--quiet implica --exit-code.

+0

Veo dos problemas con esta solución: a) 'git diff' es porcelana, y git upstream recomienda encarecidamente no usar porcelana en las secuencias de comandos. b) 'git diff' ignorará cualquier cambio no confirmado que ya esté en la memoria caché del índice. Ver mi respuesta en http://stackoverflow.com/questions/1985301/how-to-make-git-describe-mention-the-presence-or-absence-of-local-changes/1989142#1989142 para saber cómo abordar estos problemas. – ndim

+0

La pregunta se trataba de encontrar _cambios locales_. 'git diff HEAD --quiet' encuentra que'local changes 'es exactamente el resultado de dos comandos de plomería que usted ha recomendado. La diferencia entre porcelana/fontanería no es tan crucial aquí. –

+0

Los desarrolladores de git dicen usar comandos de plomería para scripts, por lo que baso mis scripts en esos. En cuanto a los * cambios locales *, 'git diff HEAD --quiet' ciertamente es funcionalmente equivalente a mis dos comandos, pero aún preferiría el API git upstream recomendado para los casos de scripting. – ndim

7

Dado que git 1.6.6, git-describe ha aceptado la opción --dirty.Si tiene cambios no confirmados en su árbol de trabajo a continuación, podrás obtener una salida como esta:

$ git describe --dirty 
1.0.2-2-g215081f-dirty 
Cuestiones relacionadas