2010-02-24 25 views
30

Tengo un repositorio que tiene varias etiquetas en la misma confirmación. Por ejemplo:Cómo obtener etiquetas en la confirmación actual

commit #3 <--- TAG1/TAG2/TAG3 

    | 

commit #2 <--- TAG4/ TAG5 

    | 

commit #1 <--- TAG6/ TAG7 

Me gustaría averiguar qué etiquetas están en una confirmación concreta. Por ejemplo, si marca comprometerse 1, me gustaría llegar etiqueta 6 y 7. etiqueta

que he intentado:

git checkout <commit 1> 
git tag --contains 

la que está representada etiquetas 1-7.

git checkout <commit 1> 
git describe --tags HEAD 

mostró la etiqueta 6 only.

¿Cuál es la forma correcta de hacer esto en Git?

Respuesta

3

Esto no es lo ideal, pero tal vez útil:

 
$ git log -n 1 --decorate --pretty=oneline 

usted podría jugar un poco con el formato para obtener exactamente lo que quieres.

+0

Gracias por su información, mi repositorio tiene más de 300 gits diferentes. Presione "Q" por 300 veces realmente difícil para mí. – Shawn

+0

@Shawn No es necesario presionar Q ... –

+0

Cuando utilizo git log para mostrar algo, necesito presionar el botón q para salir del modo de visualización de registro. No estoy seguro si enfrenta el mismo – Shawn

17

Algunas mejoras en la respuesta de William:

git config --global alias.tags 'log -n1 --pretty=format:%h%d' 

La salida se ve así:

~$ git tags 
7e5eb8f (HEAD, origin/next, origin/master, origin/HEAD, master) 
~$ git tags HEAD~6 
e923eae (tag: v1.7.0) 
+1

este es un consejo genial – cmcginty

+0

Estoy tratando de agregar comandos sed/tr/grep para convertir este resultado en una lista simple sin signos de puntuación. Puedo construir un comando como 'git log' directamente, pero el escape me está matando cuando lo puse en un alias de configuración de git. Aquí está mi comando de registro: git log -n1 --pretty = "format:% d" | sed "s /,/\ n/g" | etiqueta grep | sed "s/tag: \ |) // g" –

+0

Lo he refinado para que sea más útil para las secuencias de comandos automatizadas (por ejemplo, poner las etiquetas en el indicador), en una respuesta debajo ... –

18

supongo que tal vez GIT ha tenido algunas opciones añadidas desde que se hizo esta pregunta, pero ya que todavía viene en bastante alto en google, pensé en agregar que esta manera funciona bien:

git tag -l --contains HEAD 

O reemplace HEAD con cualquier otra referencia de confirmación válida que desee.

Esto imprimirá una línea nueva lista de etiquetas separadas si la cabeza contiene ninguna etiqueta e imprimir nada de lo contrario, por lo que se obtendría:

TAG6 
TAG7 

Y por supuesto hay un montón de maneras agradables con varios otros concha herramientas que pueden formatear ese resultado una vez que lo tiene ...

+1

Funciona a la perfección. ¿Por qué necesitas '-l'? Del manual parece que '-l' without args enumera todas las etiquetas, que es lo mismo que' tag' sin argumentos. –

+0

@cirosantilli Vaya, creo que no leí el manual con cuidado. Aunque creo que me gusta agregar el '-l' porque se asegura de que no termine agregando una nueva etiqueta si olvido el indicador' --contains'. – arcticmac

+6

Esto da la salida incorrecta. Muestra todas las etiquetas que 'contienen' la confirmación dada, es decir, las etiquetas aplicadas a confirmaciones alcanzables anteriores también están incluidas. La pregunta original dice explícitamente que no quiere estas etiquetas antiguas, solo las etiquetas 'actuales' EN LA COMPROMISO dada. –

3

Aquí hay un refinamiento de la respuesta de @ JoshLee, que manipula el resultado para mostrar solo etiquetas (no sucursales, ni HEAD) y quita la palabra 'tag:' y puntuación decorativa. Esto es útil si está scripting algo que necesita para encontrar las etiquetas actuales (por ejemplo, los puso en su sistema): salida

git log -n1 --pretty="format:%d" | sed "s/, /\n/g" | grep tag: | sed "s/tag: \|)//g" 

Ejemplo:

$ git log -n 1 --decorate=short 
commit a9313...c7f2 (HEAD, tag: v1.0.1, tag: uat, mybranch) 
... 
$ git log -n1 --pretty="format:%d" | sed "s/, /\n/g" | grep tag: | sed "s/tag: \|)//g" 
v1.0.1 
uat 
3

Esto muestra el ID de comprometerse de la cabeza, así como también cualquier rama o etiqueta que también esté exactamente en HEAD.

git reflog --decorate -1 

Salida de ejemplo:

484c27b (HEAD, tag: deployment-2014-07-30-2359, master, origin/master) [email protected]{0}: 484c27b878ca5ab45185267f4a6b56f8f8d39892: updating HEAD 
55

Para finalizar (gracias a Ciro Santili respuesta), git-tag tiene las --points -al opción que hace exactamente lo que Shawn está pidiendo.

git tag -l --points-at HEAD 

No tiene el efecto de una lista de las etiquetas puestas en adelante se compromete como Jonathan Hartley dijo en su comentario de las --contains git-tag.

+0

Esta es la mejor respuesta aquí. No se necesita una línea de comandos complicada, pero solo da el nombre de la etiqueta. –

+0

Exactamente lo que necesitaba, gracias. –

Cuestiones relacionadas