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 status
y 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-index
funcionó 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 --refresh
antesgit 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
haridsv
señala en los comentarios quegit diff-files
en un nuevo archivo no lo detecta como una diferencia.El enfoque más seguro parece ser ejecutar
git add
primero en la especificación del archivo y luego usargit diff-index
para 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_tree
función " que está escrita mientras hablamos ;) (principios de octubre de 2010)fuente
git diff-index --quiet HEAD
.HEAD
en el directorio de trabajo. Mejor usogit diff-index --quiet HEAD --
.git status --help
estados: - 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 status
se 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.--porcelain
parámetro como se muestra aquígit status -s -uall
para incluir archivos sin seguimiento.git diff --exit-code
devolverá un valor distinto de cero si hay algún cambio;git diff --quiet
Es 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, sifile
se cambió entre HEAD ~ y HEAD, después degit reset HEAD~ -- file
eso, 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 laelse
cláusulagit add "$file"; git commit -m "your autocommit process" "$file"
git status -s
ungit status --porcelain ; git clean -nd
lugar, 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 add
ygit clean
al 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
PATH
llamadagit-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 diff
Aquí está la mejor y más limpia manera.
fuente
git status
es 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