¿Cómo edito un mensaje de etiqueta existente en Git?

Resuelto jared asked hace 13 años • 11 respuestas

Tenemos varias etiquetas anotadas en nuestro repositorio de Git. Las etiquetas más antiguas tienen mensajes falsos que nos gustaría actualizar para que tengan nuestro nuevo estilo.

% git tag -n1
v1.0 message
v1.1 message
v1.2 message
v2.0 Version 2.0 built on 15 October 2011.

En este ejemplo, nos gustaría que los mensajes v1.x se parecieran al mensaje v2.0. ¿Cómo haríamos esto?

jared avatar Oct 19 '11 03:10 jared
Aceptado
git tag <tag name> <tag name>^{} -f -m "<new message>"

Esto creará una nueva etiqueta con el mismo nombre (sobrescribiendo la original).

Andy avatar Oct 18 '2011 20:10 Andy

Para actualizar un mensaje complejo, simplemente especifique la opción de etiqueta anotada con -ao la opción de etiqueta firmada con -s:

git tag <tag name> <tag name>^{} -f -a

Esto abrirá un editor con el contenido de su mensaje de etiqueta anterior .

Eric Hu avatar Jan 02 '2013 23:01 Eric Hu

git tag <tag name> <tag name>^{} -f -a

Esta es una mejora: sin ^{}ella, se creará un nuevo objeto de etiqueta que hará referencia al objeto de etiqueta anterior, donde ambos tendrán el mismo nombre de etiqueta.

<tag name>^{}resolverá la etiqueta/referencia hasta que encuentre el primer hash de confirmación.

Sungam avatar May 08 '2014 04:05 Sungam

TL;DR

Puedes hacer esto eliminando tu etiqueta y recreándola mientras falsificas la fecha y el autor:

> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]

Toda la historia:

Sobre la base de la respuesta de Sungram (propuesta originalmente como edición):

1. Respuesta aceptada

Esta es una mejora con respecto a las respuestas de Andy y Eric Hu . Sus respuestas crearán un nuevo objeto de etiqueta que hace referencia al antiguo objeto de etiqueta y ambos tendrán el mismo nombre.

Para ilustrar esto, considere lo siguiente:

> git tag tag1 tag1 -f -a  # accepted answer
> git rev-list --objects -g --no-walk --all
[ example output: ]
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
260ab7928d986472895b8c55e54569b3f3cb9517 tag1
a5797673f610914a45ef7ac051e3ee831a6e7c25 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17

> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of updated tag]
[Updated description]

tag tag1
Tagger: [tagger]
Date:   [date of original tag]
[Original description]

[tagged commit details]

2. Mejora de Sungram

Usar <tag name>^{}como segundo argumento de git tageliminará todas las etiquetas anteriores con el mismo nombre.

Considere la continuación de la sesión terminal anterior:

> git tag tag1 tag1^{} -f -a  # suggested improvement
> git rev-list --objects -g --no-walk --all
[ example output: ]
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
75f02acacfd7d91d55b5bcfdfb1f00aebeed15e3 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 

> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of updated tag]
[Updated description]

[tagged commit details]

3. Reserva la fecha

Por último, si desea mantener la fecha de la etiqueta original como la fecha de la etiqueta actualizada, use algo de magia awk (o similar) o simplemente pegue la fecha que desee. Lo siguiente es un sustituto del segundo ejemplo (de lo contrario, la fecha original se perdería debido a la anulación):

> GIT_COMMITTER_DATE="$(git show tag1 |                              # get info about the tag cascade including the date original of the original tag
> awk '{
>     if ($1 == "Date:") {
>         print substr($0, index($0,$3))
>     }
> }' |                                                               # extract all the dates from the info
> tail -2 | head -1)"                                               `# get the second to last date, as the last one is the commit date` \
> git tag tag1 tag1^{} -a -f                                         # finally, update the tag message, but save the date of the old one
>
> git rev-list --objects -g --no-walk --all
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
e18c178f2a548b37799b100ab90ca785af1fede0 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17
> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of original tag]
[Updated description]

[tagged commit details]

Referencias:

  • SO: Listado rápido de objetos en la base de datos git

  • SO: cambiar la fecha de confirmación de una etiqueta git

  • Awk: tutorial e introducción

  • SO: Filtre la salida por el primer token de línea y extraiga el resto de la línea con awk

  • SO: Cómo poner un comentario de línea bash en un comando de varias líneas

4. bricolaje

Como alternativa a actualizar las etiquetas, puede simplemente eliminarlas y crearlas nuevamente. Resulta que la actualización simplemente agrega una nueva etiqueta y hace que apunte a la anterior, o alternativamente, simplemente elimina implícitamente la anterior y crea una nueva para que apunte a la misma confirmación de todos modos.

Puede lograr esto emitiendo:

> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]

Aquí [optional]hay un campo opcional; <required>es un campo obligatorio. Por supuesto, puede agregar cualquier indicador después del git tagcomando que normalmente agregaría.

stanm avatar Mar 12 '2015 20:03 stanm