2011-02-15 15 views
26

He etiquetado una confirmación con una etiqueta ligera y la he enviado a un repositorio remoto, compartido con otros desarrolladores. Ahora me he dado cuenta de que debería haberlo anotado para que aparezca en git describe.¿Se puede convertir una etiqueta liviana en una etiqueta anotada?

¿Hay alguna manera de convertirlo/volver a etiquetar el compromiso sin romper las cosas?

Respuesta

23

Una etiqueta liviana es solo una 'ref' que apunta a esa confirmación. Puede forzar a crear una nueva etiqueta anotada en la parte superior de la antigua etiqueta:

git tag -a -f <tagname> <tagname> 

A partir de Git v1.8.2, es necesario utilizar --force para sustituir las etiquetas en un mando a distancia con git push, incluso si va a reemplazar una etiqueta ligera con algo que es efectivamente un avance rápido o un objeto de etiqueta verdadero que apunta a la misma confirmación que la referencia de etiqueta existente.

git push --force origin <tagname> 
+3

Pero este no utilizar una fecha confuso? – SamB

+1

Además, ¿hay alguna implicación para los desarrolladores que ya sacaron la etiqueta liviana original? ¿Los desarrolladores verán la anotación en la nueva etiqueta una vez que la hayan retirado nuevamente, o tendrán que hacer algo especial (como eliminar su etiqueta local) antes? – sschuberth

+0

Parece que no funciona: 'sugerencia: las actualizaciones se rechazaron porque la etiqueta ya existe en el control remoto. Creo que realmente tiene que eliminar la etiqueta primero. –

17

Basado en Charles' answer y en this blog post, creo que es mejor usar algo como esto:

#!/bin/sh 
tag=$1 
date="$(git show $tag --format=%aD | head -1)" 
GIT_COMMITTER_DATE="$date" git tag -a -f $tag $tag 
+2

Nice :) En lugar de '| head -1' puedes usar '-s' o' --no-patch'. Y tal vez sea recomendable usar _committer_ date ('% cD') (y también su nombre,'% cn', como 'GIT_COMMITER_NAME'). –

2

también puede simplemente usar git describe --tags que también incluyen etiquetas de peso ligero en la búsqueda.

1

Convertir todas las etiquetas a anotación (basado en el ejemplo de Charles Bailey y el comentario de Ferenc Wagner):

for tag in $(git tag -l); do git tag -a -f $tag $tag^0 -m $tag; done 
git push --tags --force 
Cuestiones relacionadas