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.

Zitrax
fuente

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.

max
fuente
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.

yorammi
fuente
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.

Aristóteles Pagaltzis
fuente
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,.*/,,'
Sylvain Defresne
fuente
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')
Progman
fuente