Cómo enumerar todas las etiquetas que apuntan a una confirmación específica en git


81

He visto los comandos git describey git-name-revno he logrado que incluyan más de una etiqueta.

Ejemplo: tengo el sha1 48eb354 y sé que las etiquetas A y B apuntan a él. Entonces quiero un comando git git {something} 48eb354que produzca una salida similar a "A, B". No estoy interesado en conocer referencias relativas a otras etiquetas o ramas, solo coincidencias exactas para las etiquetas.

Respuestas:


45

git show-ref --tags -d | grep ^48eb354 | sed -e 's,.* refs/tags/,,' -e 's/\^{}//'

debería funcionar tanto para etiquetas ligeras como anotadas.


Gracias. Exactamente lo que quiero.
mrutyunjay

Esto funciona bien para git <1.7.10. ¿Puedes explicar qué hace esa segunda parte de la expresión sed? -e 's/\^{}//'
Dave

Ah, no importa, lo descubrí. Es para la -dopción activada git show-ref. De los documentos, "-d, --dereference Desreferencia etiquetas en ID de objeto también. Se mostrarán con" ^ {} "adjunto."
Dave

1
Ligera mejora / generalización para el uso de ${ref}etiquetas arbitrarias , incluidas las anotadas:hash=$(git rev-parse "${ref}^0"); git show-ref --tags -d | sed -n -e 's,^'"${hash}"' refs/tags/\(.*\)^{}$',\1,p'
Christian Goetze


50

Puedes usar:

git tag --contains <commit>

que muestra todas las etiquetas en cierto compromiso. Se puede utilizar en lugar de:

git tag --points-at HEAD

que está disponible solo desde 1.7.10.


10
NB: 'git tag --contains' no muestra solo las etiquetas que apuntan a la confirmación, sino que también incluye las etiquetas posteriores desde las que se puede acceder.
staafl

Al menos en la versión 2.6.4, esto solo devuelve una única etiqueta que apunta a la confirmación especificada. No los devuelve a todos. La respuesta anterior de @max parece funcionar correctamente para varias etiquetas.
Dejay Clayton

--containstambién parece mucho más lento que --points-at(tiempo de ejecución de 7-8 s frente a <1 s)
SSilk

4
git for-each-ref --format='%(objectname) %(refname:short)' refs/tags/ |
  grep ^$commit_id |
    cut -d' ' -f2

Lástima que no se pueda hacer más fácilmente. Otra bandera git tagpara incluir ID de confirmación podría expresar esa git for-each-refinvocación de forma natural.


1
Gracias por la información, pero parece que tampoco puedo ver las etiquetas con este comando. El uso del "git for-each-ref | grep 48eb354" más simple da 0 coincidencias. gitk, por otro lado, enumera muy bien las 2 etiquetas delante de esta confirmación.
Zitrax

1

El siguiente comando hace el trabajo, pero analiza directamente el contenido del directorio .git y, por lo tanto, puede romperse si cambia el formato del repositorio git.

grep -l -r -e '^48eb354' .git/refs/tags|sed -e 's,.*/,,'

Tampoco los enumera, el único lugar donde veo el sha1 si grepping toda la carpeta .git es en gitk.cache y logs / refs / remotes / origin / master. ¿Cómo es que gitk puede enumerarlos? También me doy cuenta de que las etiquetas que estoy viendo son etiquetas anotadas, esta podría ser la razón por la que las dos respuestas actuales no me funcionan.
Zitrax

1

Para el compromiso actual puede usar

git tag --points-at $(git log -n1 --pretty='%H')
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.