2011-03-30 12 views
12

Estoy escribiendo un comando git personalizado que solo debe ejecutarse en un repositorio completamente nuevo sin confirmaciones (ver this question). ¿Cómo puedo realizar una verificación simple dentro de mi script para ver si un repositorio existente tiene cero confirmaciones?¿Cómo puedo verificar si un repositorio de git tiene alguna confirmación?

Básicamente, ¿qué pasa en el espacio en blanco a continuación?

if ___________ ; then 
    echo "Git repo already has commits. Aborting. 
else 
    echo "Git repo has no commits. Doing whatever my script does." 
fi 
+2

¿Sería necesario algún tipo de registro? –

Respuesta

21

Resumen:

  • Una confirmación está desprotegido: Prueba git rev-parse HEAD &> /dev/null
  • Un ref apuntando a un compromiso existe: Prueba existen git rev-list -n 1 --all &> /dev/null
  • objetos en el repositorio: salida de prueba de git fsck, git count-objects, o examinar los contenidos de .git/objects

¡Y ahora para la discusión!

Si desea saber si una confirmación está desprotegida, puede usar git rev-parse HEAD. Habrá salida, por lo que probablemente desee redireccionar al /dev/null y simplemente use el código de salida. Para todos los propósitos prácticos, esto será lo suficientemente bueno: haciendo cosas normales, es prácticamente imposible terminar sin HEAD apuntando a nada. Pero es posible, por ejemplo, eliminando archivos en el directorio .git. Dependiendo de su secuencia de comandos, esto podría ser importante: si está a punto de arruinar el directorio .git, realmente quiere ser paranoico.

Si desea ver si hay refs en absoluto con commits en ellos, puede usar git rev-list -n 1 --all. De nuevo, habrá una salida (SHA1 de la primera confirmación encontrada), así que redirija a /dev/null y verifique el código de salida.

Por último, si desea comprobar si hay confirmaciones, incluso si no están en ningún árbitro (debe intentar Realmente es difícil entrar en este estado) Probablemente solo verifique la presencia de objetos con git fsck o git count-objects - o en su defecto, liste .git/objects y busque cualquier cosa además de info y pack (los comandos tienden a fallar si no hay ningún archivo .git/HEAD). Y sí, podrías tener un repositorio con manchas y árboles, pero sin compromisos, pero tendrías que esforzarte aún más para llegar allí. Estos son los métodos más seguros, si su script es aterrador.

+3

Bueno, eso lo cubre. –

+0

Como estamos lidiando con esto actualmente, pensé que podría notar que el '' git rev-parse HEAD'' es sensible al caso donde no hay una rama "maestra". '' git init --bare'' al menos en mi extremo crea un repositorio con HEAD apuntando al maestro; pero alguien puede aparecer y enviar commits a algún otro nombre de rama y el script no los detectará (a menos que un gancho actualice HEAD o algo así). Esto parece un caso bastante típico que vale la pena mencionar en la respuesta. – OEP

+0

tenga en cuenta que 'git fsck' no es de solo lectura o podría tomar mucho tiempo, y que' git count-objects' reportará ZERO si solo hay un paquete. Puedes probar 'git count-objects -v' para ver también cuántos objetos hay en los paquetes. – robbat2

3

que desea utilizar git log

Si está utilizando cygwin o están en una máquina Linux gitk es un programa útil tener también.

+0

git log devuelve un error si no hay confirmaciones. ¿Estás diciendo que debería interpretar un valor de retorno distinto de cero como una indicación de que el repositorio no tiene confirmaciones? –

+2

correcto, el registro de git le dará un error al decir que no hay 'HEAD', lo que significa que no existe nada. Además, si usas 'git branch -l', tampoco obtendrás ningún resultado (ni error). Si existiera un compromiso, también existiría una sucursal (no puede tener uno sin el otro). – RDL

+1

Si bien eso es cierto en el uso normal, sin duda podría arreglárselas para deshacerse de todas sus ramas (y aún así cometer errores) si lo desea, o si cometió un error de shell particularmente desafortunado. – Cascabel

Cuestiones relacionadas