web-dev-qa-db-fra.com

Changer la date du tag git (ou la version de GitHub en fonction

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?

 mapping of releases and dates between gitk and GitHub

81
Phrogz

ATTENTION: Ceci not préservera les messages de balise pour les balises annotées.

Résumé

Pour chaque tag à modifier:

  1. Remonter dans le temps jusqu'au commit représentant le tag
  2. Supprimer la balise (localement et à distance)
    • _ {Ceci transformera votre "version" sur GitHub en un brouillon que vous pourrez supprimer ultérieurement.
  3. Ajoutez à nouveau la balise du même nom en utilisant un appel magique qui définit sa date sur la date de validation.
  4. Repoussez les nouvelles balises avec des dates fixes sur GitHub.
  5. Allez sur GitHub, supprimez toutes les versions actuelles 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 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.

101
Phrogz

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.

15
vmrob

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:

0
weiji14