¿Cómo puedo verificar, en una secuencia de comandos, si hay cambios locales? ¿Quizás en combinación con git describe
?¿Cómo hacer que "git describe" mencione la presencia o ausencia de cambios locales?
Respuesta
Usted tendrá que asegurarse de que tanto las dos propiedades siguientes se cumplen:
que no hay diferencias entre la cabeza y la caché del índice
git diff-index --cached HEAD
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.
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".
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 –
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
.
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
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í. –
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
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
- 1. Git: deshacer cambios locales; git add. + git rm?
- 2. git: ¿Cómo sobrescribo todos los cambios locales en la fusión?
- 3. git pull manteniendo los cambios locales
- 4. Git Pull ignorando los cambios locales
- 5. Evitar que se realicen cambios locales en Git
- 6. GIT: Agregar cambios locales a la sucursal no actual
- 7. Cómo hacer GIT ignorar mis cambios
- 8. ¿Plantilla especializada de C++ basada en la presencia/ausencia de un miembro de la clase?
- 9. ¿Cómo hacer que git ignore los cambios en el caso?
- 10. Mantener los cambios locales en un repositorio git
- 11. haga un git pull para sobrescribir cambios locales
- 12. git selectivo revertir cambios locales desde un archivo
- 13. ¿Puedo hacer que git diff ignore los cambios de permisos?
- 14. Git diff informa cambios locales 'old mode'/'new mode'
- 15. git: cómo "consolidar" las confirmaciones locales
- 16. cómo descartar los cambios de la sucursal local de git?
- 17. Git rebase falla, 'Tus cambios locales a los siguientes archivos se sobrescribirán mediante fusión'. No hay cambios locales?
- 18. Git recupera cambios no confirmados
- 19. ¿Qué es un flujo de trabajo práctico para mantener los cambios locales sin compromiso en git?
- 20. ¿Cómo hacer que svn diff muestre cambios remotos?
- 21. será la creación de una rama git borrar mis cambios locales
- 22. Cómo enviar cambios locales a un repositorio remoto de git en bitbucket
- 23. ¿La reflexión es la mejor manera de determinar la presencia/ausencia de propiedad/método en un objeto dinámico?
- 24. ¿Cómo hacer cambios que solo yo puedo ver?
- 25. git cherry-pick dice existen cambios locales, pero no dice nada git status
- 26. ¿Cómo hacer que Git Merge maneje cambios no confirmados en mi árbol de trabajo?
- 27. Mover cambios locales en una sucursal
- 28. Git pulling changes entre dos repositorios locales
- 29. Git-Tfs: ¿Un conjunto de cambios TFS por Git Commit?
- 30. ¿Cómo hacer que gitk muestre solo las sucursales locales?
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 –