AVERTISSEMENT: cela ne conservera pas les messages de balise pour les balises annotées.
Résumé
Pour chaque balise à modifier:
- Remontez dans le temps jusqu'au commit représentant le tag
- Supprimer le tag (localement et à distance)
- Cela transformera votre "Release" sur GitHub en un brouillon que vous pourrez supprimer ultérieurement.
- Ajoutez à nouveau la balise du même nom en utilisant un appel magique qui définit sa date sur la date de la validation.
- Poussez les nouvelles balises avec des dates fixes vers GitHub.
- Accédez à GitHub, supprimez toutes les versions actuellement brouillon et recréez de nouvelles versions à partir des nouvelles balises
Dans du code:
# 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
Détails
Selon Comment étiqueter dans Git :
Si vous oubliez de marquer une version ou une modification de version, vous pouvez toujours la marquer rétroactivement comme ceci:
git checkout SHA1_OF_PAST_COMMIT
git tag -m"Retroactively tagging version 1.5" v1.5
Et bien que cela soit parfaitement utilisable, cela a pour effet de mettre vos balises dans l'ordre chronologique, ce qui peut se visser avec des systèmes de construction qui recherchent la «dernière» balise. Mais n'ayez pas peur. Linus a pensé à tout:
# 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"
Cependant, si vous avez déjà ajouté la balise, vous ne pouvez pas utiliser ce qui précède avec git tag -f existingtag
sinon git se plaindra lorsque vous essayez de fusionner:
Rammy:docubot phrogz$ git push --tags
To [email protected]:Phrogz/docubot.git
! [rejected] 1.0.1 -> 1.0.1 (already exists)
error: failed to push some refs to '[email protected]:Phrogz/docubot.git'
hint: Updates were rejected because the tag already exists in the remote.
Au lieu de cela, vous devez supprimer la balise localement:
git tag -d 1.0.1
Poussez cette suppression à distance:
git push origin :refs/tags/1.0.1
Sur GitHub, rechargez les versions (la version a maintenant été marquée comme "Brouillon") et supprimez le brouillon.
Maintenant, ajoutez la balise antidatée en fonction des instructions ci-dessus, et enfin poussez la balise résultante vers GitHub:
git push --tags
puis allez et ajoutez à nouveau les informations de version de GitHub.
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
git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) && git tag -d $tag && git push origin :refs/tags/$tag && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a $tag -m"$tag" $COMMIT_HASH ; done && git push --tags
git tag -af
rend-d
inutile et vous restez local afin que vous puissiez vérifier que tout va bien - alors vous pouvezgit push --tags -f
git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH ; done && git push --tags --force
$env:GIT_COMMITTER_DATE="Thu Nov 11 12:21:57 2010 -0800"
etgit tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
Voici un aperçu basé sur certains des commentaires de l'autre réponse:
Pour le décomposer ...
Merci à @Mr_and_Mrs_D pour la suggestion d'utiliser un seul push.
la source
Sur la base des autres réponses, voici une manière qui va préserver la première ligne du message d'étiquette
Le bit responsable de la conservation des messages est:
head -n1
prendra la première ligne de l'ancien message de validation. Vous pouvez le modifier en-n2
ou-n3
etc pour obtenir deux ou trois lignes à la place.Si vous souhaitez modifier la date / l'heure pour une seule balise, voici comment vous pouvez décomposer le one-liner pour le faire dans votre shell bash:
Références:
la source
-s
drapeau qui n'est pas présent dans le one-liner, donc j'obtenaiserror: gpg failed to sign the data
parce que je n'ai pas configuré de signature pour git. Cette erreur m'a un peu dérangé.