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 hacer que los mensajes v1.x se parezcan al mensaje v2.0. Alguien sabe cómo haríamos esto?
git tag -m "A message" --edit v1.0
sería suficiente. Vea mi respuesta a continuaciónfatal: tag 'v6.6.2' already exists
usando2.17.0
.Respuestas:
git tag <tag name> <tag name>^{} -f -m "<new message>"
Esto creará una nueva etiqueta con el mismo nombre (sobrescribiendo el original).
fuente
git tag --help
.git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"
<tag name>^{}
old tag
Para actualizar un mensaje complejo, solo especifique la opción de etiqueta anotada con
-a
o la opción de etiqueta firmada con-s
:Esto abrirá un editor con el contenido de su antiguo mensaje de etiqueta .
fuente
git tag <tag name> <tag name>^{} -f -a
Esto es una mejora: sin
^{}
él creará un nuevo objeto de etiqueta que haga 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.fuente
usage: git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]
TL; DR
Puede hacerlo eliminando su etiqueta y volviéndola a crear mientras falsifica la fecha y el autor:
Toda la historia:
Basándose en la respuesta de Sungram (originalmente propuesta como una edición):
1. Respuesta aceptada
Esta es una mejora sobre Andy y Eric Hu las respuestas de . Sus respuestas crearán un nuevo objeto de etiqueta que hace referencia al objeto de etiqueta anterior y ambos tendrán el mismo nombre.
Para ilustrar esto, considere lo siguiente:
2. Mejora de Sungram
Usar
<tag name>^{}
como segundo argumento degit tag
will eliminará todas las etiquetas anteriores con el mismo nombre.Considere la continuación de la sesión terminal anterior:
3. Guardar la fecha
Por último, si desea mantener la fecha de la etiqueta original como la fecha de la etiqueta actualizada, use un poco de magia awk (o similar) o simplemente pegue la fecha que desee. El siguiente es un sustituto del segundo ejemplo (de lo contrario, la fecha original se perdería debido a la anulación):
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: un tutorial y una 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 comentarios de línea bash en un comando de varias líneas
4. bricolaje
Como alternativa a la actualización de las etiquetas, puede eliminarlas y crearlas nuevamente. Como resultado, la actualización solo agrega una nueva etiqueta y hace que apunte a la anterior, o alternativamente, simplemente elimina implícitamente la anterior y crea una nueva para apuntar a la misma confirmación de todos modos.
Puede lograr esto emitiendo:
Aquí
[optional]
hay un campo opcional;<required>
es un campo obligatorio. Por supuesto, puede agregar cualquier indicador después delgit tag
comando que normalmente haría.fuente
The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
La solución de @Andy
es incorrecta . Después de eso, con
comando, veremos etiquetas de pila con el mismo nombre.
Agrega una nueva etiqueta con el mismo nombre de etiqueta y un nuevo mensaje en la confirmación
<tag-name>
. Pero no elimina la etiqueta vieja. Es un caso especial de este comando:Pero
<old-tag>
es lo mismo con<tag-name>
.La solución correcta es simple, solo actualizar la etiqueta está bien.
Recuerda, solo UNO aquí.
Si queremos cambiar la etiqueta, que no lo es
HEAD
, necesitamos un<commit>
argumento adicional .fuente
git show <tag>
y veo todas las ediciones anteriores.HEAD
, pasando el extra<commit>
, la etiqueta abierta está vacía. Esperaba que la etiqueta anterior solo se editara. ¿Hay camino?git tag <commit> <tag-name> -f -a
tiene <commitir> y <tag-name> invertidos? Se ve de esta manera cuando se compara con otras respuestas y los documentos, pero no soy un experto.Con Git 2.17 (Q2 2018), habrá una alternativa a la creación de una nueva etiqueta con
git tag <tag name> <tag name> -f -m "<new message>"
, ya que la opción "git tag
" aprendió un explícito "--edit
" que permite editar el mensaje dado a través de "-m
" y "-F
".Ver commit 9eed6e4 (06 de febrero de 2018) por Nicolas Morey-Chaisemartin (
nmorey
) .(Fusionada por Junio C Hamano -
gitster
- en commit 05d290e , 06 mar 2018)Agregue una
--edit
opción que permita modificar los mensajes proporcionados por-m
o-F
, de la misma maneragit commit --edit
.fuente
--edit
que utilice las direcciones del OP?-f
también se agrega la bandera,--edit
se editará el mensaje y se modificará la marca de tiempo, ¿verdad?Deberá etiquetar nuevamente, utilizando la
-f
bandera de fuerza.fuente
Usando las respuestas anteriores, este es mi alias de una línea
.gitconfig
. Reemplaza la etiqueta existente y conserva la fecha de confirmación.Mejoras?
fuente
tag-amend = "!sh -c 'f() { name=$(git log -1 --format=%an $0); email=$(git log -1 --format=%ae $0); date=$(git log -1 --format=%ci $0); GIT_AUTHOR_NAME=\"${name}\" GIT_COMMITTER _NAME=\"${name}\" GIT_AUTHOR_EMAIL=\"${email}\" GIT_COMMITTER_EMAIL=\"${email}\" GIT_AUTHOR_DATE=\"${date}\" GIT_COMMITTER_DATE=\"${date}\" git tag -f -a $0 $0^{}; }; f '"
Si está utilizando una GUI como smartgit solo
fuente