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 [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.
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
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
macht-d
unnötig und Sie bleiben lokal, damit Sie überprüfen können, ob alles in Ordnung ist - dann können Siegit 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"
undgit tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
Hier ist ein Einzeiler basierend auf einigen Kommentaren in der anderen Antwort:
Um es zu brechen ...
Vielen Dank an @Mr_and_Mrs_D für den Vorschlag, einen einzelnen Push zu verwenden.
quelle
Aufbauend auf den anderen Antworten, hier ist ein Weg, wird die erste Zeile der Tag - Nachricht erhalten
Das Bit, das für die Aufbewahrung der Nachrichten verantwortlich ist, ist:
head -n1
nimmt die erste Zeile der alten Festschreibungsnachricht. Sie können es in-n2
oder ändern-n3
usw. , um stattdessen zwei oder drei Zeilen zu erhalten.Wenn Sie Datum und Uhrzeit für nur ein Tag ändern möchten, können Sie den Einzeiler folgendermaßen aufteilen, um dies in Ihrer Bash-Shell zu tun:
Verweise:
quelle
-s
Flag, das im Einzeiler nicht vorhanden ist. Ich habe es also erhalten,error: gpg failed to sign the data
weil ich keine Signatur für git eingerichtet habe. Dieser Fehler warf mich ein bisschen ab.