1512 Stimmen

Wie benennt man ein Git-Tag um?

Heute habe ich die Protokolle für ein Projekt durchgesehen und festgestellt, dass ich vor einiger Zeit einen Tag-Namen falsch benannt habe. Gibt es eine Möglichkeit, die Markierung umzubenennen? Google hat nichts Nützliches gefunden.

Mir ist klar, dass ich die getaggte Version auschecken und ein neues Tag erstellen könnte, das habe ich auch schon versucht. Aber das scheint ein Tag-Objekt zu erzeugen, das nicht ganz richtig ist. Zum einen,

git tag -l

listet sie im Vergleich zu allen anderen Tags in einer falschen Reihenfolge auf. Ich habe keine Ahnung, ob das von Bedeutung ist, aber es führt mich zu der Annahme, dass das neue Tag-Objekt nicht ganz das ist, was ich will. Ich kann damit leben, weil ich wirklich nur darauf achte, dass der Tag-Name mit der Dokumentation übereinstimmt, aber ich würde es lieber "richtig" machen, vorausgesetzt, es gibt einen richtigen Weg, dies zu tun.

27voto

Jared Knipp Punkte 5734

Als Ergänzung zu den anderen Antworten habe ich einen Alias hinzugefügt, um alles in einem Schritt zu erledigen, mit einem vertrauteren *nix-Befehl. Argument 1 ist der alte Tag-Name, Argument 2 ist der neue Tag-Name.

[alias]
    renameTag = "!sh -c 'set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags' -"

Verwendung:

git renametag old new

25voto

vikas pachisia Punkte 433

Befolgen Sie den 3-Schritt-Ansatz für ein oder einige wenige Tags.

Schritt 1: Identifizieren Sie die Commit-/Objekt-ID des Commits, auf das das aktuelle Tag verweist

command: git rev-parse <tag name>
example: git rev-parse v0.1.0-Demo
example output: db57b63b77a6bae3e725cbb9025d65fa1eabcde

Schritt 2: Löschen des Tags aus dem Repository

command: git tag -d <tag name>
example: git tag -d v0.1.0-Demo
example output: Deleted tag 'v0.1.0-Demo' (was abcde)

Schritt 3: Erstellen Sie ein neues Tag, das auf dieselbe Commit-ID verweist, auf die auch das alte Tag verweist

command: git tag -a <tag name>  -m "appropriate message" <commit id>
example: git tag -a v0.1.0-full  -m "renamed from v0.1.0-Demo" db57b63b77a6bae3e725cbb9025d65fa1eabcde
example output: Nothing or basically <No error>

Sobald das lokale Git mit der Tag-Namen-Änderung fertig ist, können diese Änderungen zurück zum Ursprung gepusht werden, damit andere sie übernehmen können:

command: git push origin :<old tag name> <new tag name>
example: git push origin :v0.1.0-Demo v0.1.0-full
example output: <deleted & new tags>

21voto

M. Justin Punkte 8707

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.

6voto

wolfc Punkte 2099

Abenteuerlustige können dies mit einem einzigen Befehl erledigen:

mv .git/refs/tags/OLD .git/refs/tags/NEW

3voto

zionyx Punkte 1677

Sie können auch entfernte Tags umbenennen, ohne sie auszuchecken, indem Sie das alte Tag/die alte Verzweigung unter einem neuen Namen duplizieren und das alte Tag/die alte Verzweigung löschen, und zwar in einem einzigen git push Befehl.

Umbenennung von Remote-Tags / Konvertierung von Remote-Zweig-Tags: (Hinweis: :refs/tags/ )

git push <remote_name> <old_branch_or_tag>:refs/tags/<new_tag> :<old_branch_or_tag>

Umbenennung von Remote-Zweigen / Konvertierung von Remote-Tag-Zweigen: (Hinweis: :refs/heads/ )

git push <remote_name> <old_branch_or_tag>:refs/heads/<new_branch> :<old_branch_or_tag>

Ausgabe der Umbenennung eines entfernten Tags:

D:\git.repo>git push gitlab App%2012.1%20v12.1.0.23:refs/tags/App_12.1_v12.1.0.23 :App%2012.1%20v12.1.0.23

Total 0 (delta 0), reused 0 (delta 0)
To https://gitlab.server/project/repository.git
 - [deleted]               App%2012.1%20v12.1.0.23
 * [new tag]               App%2012.1%20v12.1.0.23 -> App_12.1_v12.1.0.23

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X