ADVERTENCIA: Esto no conservará los mensajes de etiqueta para etiquetas anotadas.
Resumen
Para cada etiqueta que deba cambiarse:
- Retroceda en el tiempo hasta la confirmación que representa la etiqueta
- Eliminar la etiqueta (local y remotamente)
- Esto convertirá su "Lanzamiento" en GitHub en un Borrador que luego podrá eliminar.
- Vuelva a agregar la etiqueta del mismo nombre mediante una invocación mágica que establece su fecha en la fecha de la confirmación.
- Inserte las etiquetas nuevas con fechas fijas en GitHub.
- Vaya a GitHub, elimine las versiones en borrador actual y vuelva a crear nuevas versiones a partir de las nuevas etiquetas
En codigo:
# Fixing tag named '1.0.1'
git checkout 1.0.1 # Go to the associated commit
git tag -d 1.0.1 # Locally delete the tag
git push origin :refs/tags/1.0.1 # Push this deletion up to GitHub
# Create the tag, with a date derived from the current head
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a 1.0.1 -m"v1.0.1"
git push --tags # Send the fixed tags to GitHub
Detalles
Según Cómo etiquetar en Git :
Si olvida etiquetar un lanzamiento o un salto de versión, siempre puede etiquetarlo retroactivamente así:
git checkout SHA1_OF_PAST_COMMIT
git tag -m"Retroactively tagging version 1.5" v1.5
Y aunque eso es perfectamente utilizable, tiene el efecto de poner sus etiquetas fuera de orden cronológico, lo que puede arruinar los sistemas de construcción que buscan la etiqueta "más reciente". Pero no tengas miedo. Linus pensó en todo:
# This moves you to the point in history where the commit exists
git checkout SHA1_OF_PAST_COMMIT
# This command gives you the datetime of the commit you're standing on
git show --format=%aD | head -1
# And this temporarily sets git tag's clock back to the date you copy/pasted in from above
GIT_COMMITTER_DATE="Thu Nov 11 12:21:57 2010 -0800" git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
# Combining the two...
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
Sin embargo, si ya ha agregado la etiqueta, no puede usar lo anterior con git tag -f existingtag
o, de lo contrario, git se quejará cuando intente fusionar:
Rammy:docubot phrogz$ git push --tags
To git@github.com:Phrogz/docubot.git
! [rejected] 1.0.1 -> 1.0.1 (already exists)
error: failed to push some refs to 'git@github.com:Phrogz/docubot.git'
hint: Updates were rejected because the tag already exists in the remote.
En su lugar, debe eliminar la etiqueta localmente:
git tag -d 1.0.1
Empuje esa eliminación de forma remota:
git push origin :refs/tags/1.0.1
En GitHub, vuelva a cargar Versiones (la versión ahora se ha marcado como "Borrador") y elimine el borrador.
Ahora, agregue la etiqueta retroactiva según las instrucciones anteriores y finalmente envíe la etiqueta resultante a GitHub:
git push --tags
y luego vaya y vuelva a agregar la información de la versión de GitHub nuevamente.
git tag -l | while read -r tag; do `git checkout $tag && git tag -d $tag && git push origin :refs/tags/$tag && GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a $tag -m"$tag"`; done; git push --tags