WARNUNG: Hiermit werden keine Tag-Nachrichten für kommentierte Tags beibehalten.
Zusammenfassung
Für jedes Tag, das geändert werden muss:
- Gehen Sie zurück in die Zeit des Commits, das das Tag darstellt
- Löschen Sie das Tag (lokal und remote)
- Dadurch wird Ihre "Veröffentlichung" auf GitHub in einen Entwurf umgewandelt, den Sie später löschen können.
- Fügen Sie das gleichnamige Tag erneut hinzu, indem Sie einen magischen Aufruf verwenden, dessen Datum auf das Datum des Commits festgelegt wird.
- Schieben Sie die neuen Tags mit festen Daten zurück auf GitHub.
- Gehen Sie zu GitHub, löschen Sie alle jetzt entworfenen Releases und erstellen Sie neue Releases aus den neuen Tags neu
In 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
Einzelheiten
Laut How to Tag in Git :
Wenn Sie vergessen haben, ein Release oder einen Versions-Bump zu markieren, können Sie es jederzeit rückwirkend wie folgt markieren:
git checkout SHA1_OF_PAST_COMMIT
git tag -m"Retroactively tagging version 1.5" v1.5
Und obwohl dies perfekt verwendbar ist, hat es den Effekt, dass Ihre Tags in chronologischer Reihenfolge angeordnet werden, was mit Build-Systemen, die nach dem "neuesten" Tag suchen, verschraubt werden kann. Aber keine Angst. Linus dachte an alles:
# 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"
Wenn Sie das Tag jedoch bereits hinzugefügt haben, können Sie das oben genannte nicht mit verwenden git tag -f existingtag
, da sich git sonst beim Zusammenführen beschwert:
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.
Stattdessen müssen Sie das Tag lokal entfernen:
git tag -d 1.0.1
Drücken Sie diese Löschung aus der Ferne:
git push origin :refs/tags/1.0.1
Laden Sie auf GitHub Releases neu - die Version wurde jetzt als "Entwurf" markiert - und entfernen Sie den Entwurf.
Fügen Sie nun das rückdatierte Tag basierend auf den obigen Anweisungen hinzu und senden Sie das resultierende Tag schließlich an GitHub:
git push --tags
und fügen Sie dann die GitHub-Release-Informationen erneut hinzu.
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