2009-06-17 21 views
92

Tengo un script que necesita hacer referencia a la confirmación inicial en un repositorio. git tiene la referencia especial HEAD, pero no tiene el TAIL correspondiente. No puedo encontrar nada en git help rev-parse que parezca ayudarme.¿Cómo hacer referencia a la confirmación inicial?

Aquí es lo que me gusta hacer:

git show TAIL 

Aquí hay una opción que tengo:

git show `git log --reverse | if read a commit ; then echo $commit ; fi` 

Eso es bastante hacky y depende de la salida de git log no cambiar.

Ahora solo etiqueto la confirmación inicial y la uso como mi refspec. Sin embargo, me gustaría lanzar una herramienta general, por lo que no es una gran opción.

Respuesta

110

No utilizar git-log de secuencias de comandos: utilice cualquiera git-rev-lista, o git-registro con formato personalizado especificado ("--format = <algo>" opción).

Existe un problema adicional con su pregunta: no puede existir más de un como base de la cola cometer (sin padres cometen) en un repositorio (incluso si descontamos ramas desconectadas, como 'html', 'hombre' y ' todo 'en el repositorio git.git). Esto es generalmente el resultado de unir proyectos separados en uno, o usar la fusión de subárboles de un subproyecto desarrollado por separado.

Por ejemplo, el repositorio de git tiene 6 confirmaciones de raíz: git-gui, gitk (subárbol-fusionado), gitweb (fusionado, ya no desarrollado por separado), herramientas de correo git (fusionado muy temprano en el historial del proyecto) y p4- exportación rápida (quizás accidental). Eso no cuenta las raíces de 'html y' man 'branches,' convenience 'branches que contienen documentación generada previamente, y' todo 'branch con TODO list and scripts.


Puede obtener la lista de todos sin padres (raíz) sobre accesible desde rama actual usando:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" 

Si ha GIT 1.7.4.2 o posterior, puede utilizar la nueva opción --max-parents:

$ git rev-list --max-parents=0 HEAD 
+22

No pipes, all roots: 'git rev-list --max-parents = 0 HEAD' – wowest

+3

@wowest: IIRC no hubo la opción' --max-parents' cuando estaba escribiendo esta respuesta. Thansk para la actualización! –

+0

Para mí, 'git rev-list HEAD | tail -n 1' y 'git rev-list --max-parents = 0 HEAD' no me devuelven el mismo valor hash. El que usa '--max-parents = 0' de hecho está obteniendo la confirmación inicial. Solo pensé en señalar que este último parece más confiable. – jbranchaud

21

git rev-list HEAD | tail -n 1 es una opción más estable.

+8

Esto devolvería * un * de compilaciones de cola; puede haber más de una raíz (parentless) cometer –

Cuestiones relacionadas