2010-08-04 19 views
122

Tengo problemas para descubrir qué etiqueta está actualmente desprotegida.¿En qué etiqueta de git se encuentra?

Cuando hago:

git checkout tag1 
git branch 

Me parece que no puede averiguar qué etiqueta estoy. Solo registra:

* (no branch) 
master 

¿Es posible averiguar qué etiquetas están desprotegidas? En el ejemplo anterior, esto sería tag1.

Respuesta

196

Editar: Jakub Narębski tiene más git-fu. El siguiente comando mucho más simple funciona perfectamente:

git describe --tags 

(o sin el --tags si ha obtenido una etiqueta anotada Mi etiqueta es de peso ligero, por lo que necesitan los --tags..)

respuesta original de la siguiente manera:

git describe --exact-match --tags $(git log -n1 --pretty='%h') 

alguien con más git-fu puede tener una solución más elegante ...

Esto aprovecha el hecho de que git-log informa el registro a partir de lo que ha prestado. %h imprime el hash abreviado. Luego git describe --exact-match --tags encuentra la etiqueta (liviana o anotada) que coincide exactamente con esa confirmación.

La sintaxis de $() anterior asume que está utilizando bash o similar.

+12

Sólo el uso de 'git describe' mostraría nombre de la etiqueta si está exactamente en la etiqueta (anotado), o ' - -g ' si no, donde '' es el número de confirmaciones desde ''. –

+1

@Jakub - Gracias. Agregué '--exact-match' a mi respuesta segundos antes de tu comentario. Es bueno saber que puedes eliminarlo y obtener buena información de la entrada difusa. – bstpierre

+0

Gracias, esto era exactamente lo que estaba buscando. Por cierto, incluso git-describe --exact-match (sin --tags) funciona para mí. – grm

18

Cuando sale una etiqueta, tiene lo que se llama "detached head". Normalmente, la confirmación HEAD de Git es un puntero a la rama que actualmente ha retirado. Sin embargo, si revisa algo que no sea una sucursal local (una etiqueta o una sucursal remota, por ejemplo) tiene una "cabeza separada": no está realmente en ninguna rama. No debe realizar ningún commit mientras está en una cabeza separada.

Está bien revisar una etiqueta si no desea realizar ninguna modificación. Si solo está examinando el contenido de los archivos, o si desea construir su proyecto desde una etiqueta, está bien que git checkout my_tag y trabaje con los archivos, , siempre y cuando no realice ningún commit. Si desea iniciar la modificación de archivos, debe crear una rama sobre la base de la etiqueta:

$ git checkout -b my_tag_branch my_tag 

va a crear una nueva rama llamada my_tag_branch partir de my_tag. Es seguro realizar cambios en esta rama.

18

git describe es un comando porcelain, lo que se debe evitar:

http://git-blame.blogspot.com/2013/06/checking-current-branch-programatically.html

En cambio, he utilizado:

git name-rev --tags --name-only $(git rev-parse HEAD) 
+5

Devuelve "indefinido" – Stranger

+3

Esto genera un '^ 0' posterior para las confirmaciones que corresponden a las etiquetas (p. Ej., Para la etiqueta' 1.0' produce '1.0^0'). ¿Hay alguna forma de que Git solo produzca '1.0', o debería usar sed para esto? –

+0

@DanielSerodio esto funcionó para mí en bash con sed instalado: 'git name-rev --tags --name-only $ (git rev-parse HEAD) | sed's | \ ([^ \ ^] * \) \ (\^0 \) $ | \ 1 | g'' – hobs

7

git log --decorate

Esto le dirá lo que los árbitros están apuntando a el compromiso actualmente desprotegido.

24

Esto funcionó para mí git describe --tags --abbrev=0

+1

¡El único que funcionó! gracias –

+0

Sí. esto funciona incluso si no estás exactamente en esa etiqueta! :) –

+2

Uhhh. ... Si pagas el hash three commits después de la etiqueta, no estás "en esa etiqueta". Te dice la última etiqueta antes o en la confirmación que está desprotegida. Entonces esto es incorrecto – ingyhere

17

Mostrar todas las etiquetas en la cabeza actual (o cometen)

git tag --points-at HEAD 
+0

Tenga en cuenta que este comando no informa un error en la línea de comandos, incluso si el resultado aparece vacío. ¿Error? También devuelve una lista si hay varias etiquetas en esa ubicación. Es la mejor respuesta, pero los scripters deben proceder con precaución teniendo en cuenta estas advertencias. – ingyhere

Cuestiones relacionadas