En un Makefile, me gustaría realizar ciertas acciones si hay cambios no confirmados (ya sea en el árbol de trabajo o en el índice). ¿Cuál es la forma más limpia y eficiente de hacer eso? Un comando que sale con un valor de retorno de cero en un caso y distinto de cero en el otro sería adecuado para mis propósitos.
Puedo ejecutar git statusy canalizar la salida grep, pero siento que debe haber una mejor manera.

Respuestas:
ACTUALIZACIÓN : el OP Daniel Stutzbach señala en los comentarios que este simple comando
git diff-indexfuncionó para él:( 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 --refreshantesgit diff-index; de lo contrariodiff-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:
Nota: como se ha comentado por Anthony Sottile
Y
haridsvseñala en los comentarios quegit 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 usargit diff-indexpara ver si se agregó algo al índice antes de ejecutarsegit commit.Y 6502 informes en los comentarios:
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)fuente
git diff-index --quiet HEAD.HEADen el directorio de trabajo. Mejor usogit diff-index --quiet HEAD --.git status --helpestados: - porcelana Proporcione la salida en un formato fácil de analizar para los scripts. Esto es similar a la salida corta, pero se mantendrá estable en todas las versiones de Git e independientemente de la configuración del usuario. Ver abajo para más detalles.Si bien las otras soluciones son muy completas, si quieres algo realmente rápido y sucio, prueba algo como esto:
Simplemente comprueba si hay algún resultado en el resumen de estado.
fuente
[[ ... ]]está haciendo realmente la sintaxis? Nunca había visto algo así antes.git statusse ignora en esta prueba. Solo mira la salida. Echa un vistazo a esta página relacionada fiesta por detalles[,[[y como prueba de obras en bash.--porcelainparámetro como se muestra aquígit status -s -uallpara incluir archivos sin seguimiento.git diff --exit-codedevolverá un valor distinto de cero si hay algún cambio;git diff --quietEs lo mismo sin salida. Como desea verificar el árbol de trabajo y el índice, useO
Cualquiera de los dos le dirá si hay cambios no confirmados que se organizan o no.
fuente
git diff --quite HEADúnico solo le dirá si el árbol de trabajo está limpio, no si el índice está limpio. Por ejemplo, sifilese cambió entre HEAD ~ y HEAD, después degit reset HEAD~ -- fileeso, seguirá saliendo de 0 aunque haya cambios por etapas presentes en el índice (wt == HEAD, pero index! = HEAD).git diff --quiet && git diff --cached --quiet.Ampliando la respuesta de @ Nepthar:
fuente
$(git status -s "$file")y luego en laelsecláusulagit add "$file"; git commit -m "your autocommit process" "$file"git status -sungit status --porcelain ; git clean -ndlugar, directorios junk estar recubiertos también en este caso, que son invisibles agit status.Como se señaló en otra respuesta, tan simple como dicho comando es suficiente:
Si omite los dos últimos guiones, el comando fallará si tiene un archivo llamado
HEAD.Ejemplo:
Advertencia: este comando ignora los archivos no rastreados.
fuente
git addygit cleanal rescateCreé algunos prácticos alias de git para enumerar archivos sin clasificar y en etapas:
Entonces puedes hacer cosas como:
Puede hacerlo más legible creando un script en algún lugar de su
PATHllamadagit-has:Ahora los ejemplos anteriores se pueden simplificar para:
Para completar, aquí hay alias similares para archivos no rastreados e ignorados:
fuente
Con python y el paquete GitPython:
Devuelve True si el repositorio no está limpio
fuente
LOGLEVEL=DEBUG, verás todos los comandos de Popen que usa para ejecutarsegit diffAquí está la mejor y más limpia manera.
fuente
git statuses un comando de 'porcelana'. No use comandos de porcelana en los scripts, ya que pueden cambiar entre versiones de git. En su lugar, use los comandos de 'plomería'.git status --porcelain(lo que está destinado para este propósito: un formato estable que puedes analizar en un script), posiblemente también con -z (¿separado por nulo en lugar de nueva línea?), Podrías hacer algo útil con esta idea . @ codyc4321 ver stackoverflow.com/questions/6976473/… para más detalles