¿Cómo hacer referencia al commit inicial?

131

Tengo un script que necesita hacer referencia a la confirmación inicial en un repositorio. git tiene la referencia especial HEAD, pero no tiene la correspondiente TAIL. No puedo encontrar nada en git help rev-parseeso que pueda ayudarme.

Esto es lo que me gustaría 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 que la salida del registro de git no cambie.

En este momento solo etiqueto el commit inicial y lo uso como mi refspec. Sin embargo, me gustaría lanzar una herramienta general, por lo que no es una gran opción.

Bryan Larsen
fuente

Respuestas:

151

No use git-log para las secuencias de comandos: use cualquiera de los dos git-rev-listo git-logcon el formato personalizado especificado ( --format=*<sth>*opción).

Hay un problema adicional con su pregunta: puede existir más de una confirmación raíz TAIL (confirmación sin padres) en un repositorio (incluso si descontamos las ramas desconectadas, como 'html', 'man' y 'todo' en git.git repositorio). Esto suele ser el resultado de unir proyectos separados en uno o de utilizar la combinación de subárbol de un subproyecto desarrollado por separado.

Por ejemplo, el repositorio git tiene 6 commits raíz: git-gui, gitk (subtree-merged), gitweb (fusionado, ya no se desarrolla por separado), herramientas de correo git (fusionadas muy temprano en el historial del proyecto) y p4-fast-export ( tal vez accidental). Eso sin contar las raíces de las ramas 'html y' man ', las ramas "conveniencia" que contienen documentación pregenerada y la rama' todo 'con la lista TODO y los scripts.


Si tiene git 1.7.4.2 o posterior, puede usar la --max-parentsopción:

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

De lo contrario, puede obtener una lista de todas las confirmaciones sin padres (raíz) accesibles desde la rama actual utilizando:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Jakub Narębski
fuente
Para mí, git rev-list HEAD | tail -n 1y git rev-list --max-parents=0 HEADno están devolviendo el mismo valor hash para mí. Sin --max-parents=0embargo, el que usa está obteniendo la confirmación inicial. Solo pensé en señalar que esto último parece más confiable.
jbranchaud
1
@Treebranch esto podría suceder si tiene confirmaciones con marcas de tiempo extrañas. agregar --topo-orderal rev-listdebería solucionar eso, aunque creo que la --max=parents=0respuesta es la mejor.
2013
35

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

Robert Munteanu
fuente
14
Esto devolvería uno de los commits de cola; puede haber más de una confirmación raíz (sin padres)
Jakub Narębski
Esta respuesta funcionó perfectamente y solo devolvió un commit sha, mientras que git rev-list --max-parents=0 HEADdevolvió 3 commits.
protoEvangelion
tail tampoco es un comando que está allí por defecto en Windows, aunque funciona en GitBash en Windows. :)
Johny Skovdal