Ein doppeltes kommentiertes Tag - einschließlich aller Tag-Informationen wie Tagger, Nachricht und Tag-Datum - kann unter Verwendung der Tag-Informationen des bestehenden Tags erstellt werden.
SOURCE_TAG=old NEW_TAG=new; deref() { git for-each-ref \
"refs/tags/$SOURCE_TAG" --format="%($1)" ; }; \
GIT_COMMITTER_NAME="$(deref taggername)" \
GIT_COMMITTER_EMAIL="$(deref taggeremail)" \
GIT_COMMITTER_DATE="$(deref taggerdate)" git tag "$NEW_TAG" \
"$(deref "*objectname")" -a -m "$(deref contents)"
git tag -d old
git push origin new :old
Aktualisieren Sie die SOURCE_TAG
y NEW_TAG
Werte, damit sie mit den alten und neuen Tag-Namen übereinstimmen.
Dieser Befehl richtet sich nur an unsignierte Tags, obwohl es ein Leichtes sein sollte, diese Lösung auf signierte Tags auszuweiten.
Ziel
Damit es sich wirklich um eine ununterscheidbare Umbenennung handelt, sollten alle Elemente eines kommentierten Tags im neuen Tag identisch sein. Die git-tag
Dokumentation gibt die Teile eines kommentierten Tags an.
Tag-Objekte (erstellt mit -a
, -s
, oder -u
) werden als "kommentierte" Tags bezeichnet; sie enthalten ein Erstellungsdatum, den Namen und die E-Mail-Adresse des Taggers, eine Tagging-Nachricht und eine optionale GnuPG-Signatur.
Antwort Motivation
Soweit ich das beurteilen kann, haben alle anderen Antworten subtile Fehler oder geben nicht alles über die Markierung wieder (z. B. verwenden sie ein neues Markierungsdatum oder die Daten des aktuellen Benutzers als Markierer). Viele von ihnen weisen auf die Re-Tagging Warnung, obwohl dies nicht auf dieses Szenario zutrifft (es geht um das Verschieben eines Tag-Namens in eine andere Übertragung, nicht um das Umbenennen in ein anders benanntes Tag). Ich habe einige graben getan, und haben zusammen eine Lösung, die ich glaube, adressiert diese Bedenken zusammengesetzt.
Verfahren
Ein kommentierter Tag namens old
wird in diesem Beispiel verwendet und wird umbenannt in new
.
Schritt 1: Abrufen vorhandener Tag-Informationen
Zunächst müssen wir die Informationen für den vorhandenen Tag abrufen. Dies kann erreicht werden durch for-each-ref
:
Befehl:
git for-each-ref refs/tags --format="\
Tag name: %(refname:short)
Tag commit: %(objectname:short)
Tagger date: %(taggerdate)
Tagger name: %(taggername)
Tagger email: %(taggeremail)
Tagged commit: %(*objectname:short)
Tag message: %(contents)"
Ausgabe:
Tag commit: 88a6169
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: old
Tag message: Initial tag
Body line 1.
Body line 2.
Body line 3.
Schritt 2: Erstellen Sie lokal ein Duplikat-Tag
Mit den in Schritt 1 gesammelten Informationen des bestehenden Tags kann ein Duplikat des Tags mit dem neuen Namen erstellt werden.
Die Commit-ID und die Commit-Nachricht können direkt an git tag
.
Die Tagger-Informationen (Name, E-Mail und Datum) können mit der Option Git-Umgebungsvariablen GIT_COMMITTER_NAME
, GIT_COMMITTER_EMAIL
, GIT_COMMITTER_DATE
. Die Verwendung des Datums in diesem Zusammenhang wird in der Über Rückdatierungsetiketten Dokumentation für git tag
Die anderen beiden habe ich durch Experimentieren herausgefunden.
GIT_COMMITTER_NAME="John Doe" GIT_COMMITTER_EMAIL="j.doe@example.com" \
GIT_COMMITTER_DATE="Mon Dec 14 12:44:52 2020 -0600" git tag new cda5b4d -a -m "Initial tag
Body line 1.
Body line 2.
Body line 3."
Ein direkter Vergleich der beiden Etiketten zeigt, dass sie in allen wichtigen Punkten identisch sind. Das Einzige, was sich hier unterscheidet, ist die Commit-Referenz des Tags selbst, was zu erwarten ist, da es sich um zwei verschiedene Tags handelt.
Befehl:
git for-each-ref refs/tags --format="\
Tag commit: %(objectname:short)
Tagger date: %(taggerdate)
Tagger name: %(taggername)
Tagger email: %(taggeremail)
Tagged commit: %(*objectname:short)
Tag name: %(refname:short)
Tag message: %(contents)"
Ausgabe:
Tag commit: 580f817
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: new
Tag message: Initial tag
Body line 1.
Body line 2.
Body line 3.
Tag commit: 30ddd25
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: old
Tag message: Initial tag
Body line 1.
Body line 2.
Body line 3.
Als ein einziger Befehl, einschließlich der Abfrage der aktuellen Tag-Daten:
SOURCE_TAG=old NEW_TAG=new; deref() { git for-each-ref "refs/tags/$SOURCE_TAG" --format="%($1)" ; }; GIT_COMMITTER_NAME="$(deref taggername)" GIT_COMMITTER_EMAIL="$(deref taggeremail)" GIT_COMMITTER_DATE="$(deref taggerdate)" git tag "$NEW_TAG" "$(deref "*objectname")" -a -m "$(deref contents)"
Schritt 3: Löschen Sie den bestehenden Tag lokal
Als Nächstes sollte der bestehende Tag lokal gelöscht werden. Dieser Schritt kann übersprungen werden, wenn Sie die alte Markierung zusammen mit der neuen beibehalten möchten (d. h. die Markierung duplizieren, anstatt sie umzubenennen).
git tag -d old
Schritt 4: Änderungen in das entfernte Repository übertragen
Angenommen, Sie arbeiten von einem entfernten Repository aus, können die Änderungen nun mit git push
:
git push origin new :old
Dadurch wird die new
Tag und löscht die old
Tag.