J'ajoute Versions à mes projets sur GitHub en ajoutant des balises à divers commits de la branche principale.
Dans l'un de mes projets, je n'ai pas ajouté les tags aux commits par ordre chronologique. (J'ai trouvé des commits évidents et les ai marqués, puis j'ai trouvé moins évident, plus vieux et les ai marqués.)
Now GitHub affiche v1.0.1 comme étant actuel, précédé de v0.7.0 et de v1.1.2 précédant that.
Il semble que la date de création d'une balise soit utilisée comme date de publication au lieu de la validation en cours de marquage. Comment puis-je modifier mes tags pour que leurs dates soient les mêmes que celles du commit qu'ils balisent?
ATTENTION: Ceci not préservera les messages de balise pour les balises annotées.
Pour chaque tag à modifier:
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
Selon Comment taguer dans Git:
Si vous oubliez de baliser une version ou une version bump, vous pouvez toujours la baliser de manière rétroactive, comme ceci:
git checkout SHA1_OF_PAST_COMMIT git tag -m"Retroactively tagging version 1.5" v1.5
Et bien que ce soit parfaitement utilisable, cela a pour effet de mettre vos tags en ordre chronologique, ce qui peut nuire aux 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, transmettez la balise résultante à GitHub:
git Push --tags
puis ajoutez à nouveau les informations de version de GitHub.
Voici un one-liner basé sur certains des commentaires de l'autre réponse:
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
ATTENTION: ceci nuira vos tags amont et not préservera les messages des tags annotés! Assurez-vous de savoir ce que vous faites et ne le faites PAS définitivement pour un référentiel public !!!
Pour le décomposer ...
# Loop over tags
git tag -l | while read -r tag
do
# get the commit hash of the current tag
COMMIT_HASH=$(git rev-list -1 $tag)
# get the commit date of the tag and create a new tag using
# the tag's name and message. By specifying the environment
# environment variable GIT_COMMITTER_DATE before this is
# run, we override the default tag date. Note that if you
# specify the variable on a different line, it will apply to
# the current environment. This isn't desired as probably
# don't want your future tags to also have that past date.
# Of course, when you close your Shell, the variable will no
# longer persist.
GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH
done
# Force Push tags and overwrite ones on the server with the same name
git Push --tags --force
Merci à @Mr_and_Mrs_D pour la suggestion d'utiliser un seul Push.
En vous appuyant sur les autres réponses, voici une manière de conserver la première ligne du message de la balise (volonté
git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$COMMIT_MSG" $COMMIT_HASH ; done
git tag -l -n1 #check by listing all tags with first line of message
git Push --tags --force #Push edited tags up to remote
Le bit responsable de la conservation des messages est:
COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1)
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 et l'heure d'un seul tag, procédez comme suit pour décomposer le one-liner permettant de le faire dans votre shell bash:
tag=v0.1.0
COMMIT_HASH=$(git rev-list -1 $tag)
COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1)
COMMIT_DATE=$(git show $COMMIT_HASH --format=%aD | head -1)
GIT_COMMITTER_DATE=$COMMIT_DATE git tag -s -a -f $tag -m"$COMMIT_MSG" $COMMIT_HASH
Références: