Wie benennt man ein Git-Tag um?

1219

Heute habe ich in den Protokollen nach einem Projekt gesucht und festgestellt, dass ich vor einiger Zeit einen Tag-Namen fett gefingert habe. Gibt es eine Möglichkeit, das Tag umzubenennen? Google hat nichts Nützliches gefunden.

Mir ist klar, dass ich die getaggte Version auschecken und ein neues Tag erstellen kann, das habe ich sogar versucht. Aber das scheint ein Tag-Objekt zu erzeugen, das nicht ganz richtig ist. Für einen,

git tag -l

listet es in Bezug auf alle anderen Tags in der falschen Reihenfolge auf. Ich habe keine Ahnung, ob das von Bedeutung ist, aber es lässt mich glauben, dass das neue Tag-Objekt nicht ganz das ist, was ich will. Ich kann damit leben, weil es mir wirklich nur wichtig ist, 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.

Brandon Fosdick
quelle
Haben Sie denselben Aufruf verwendet, dh wenn das alte Tag mit Anmerkungen versehen / signiert wurde, ist das neue Tag auch von dieser Art oder ist es ein leichtes Tag?
Jakub Narębski
1
Sowohl das falsche alte Tag als auch das gewünschte neue Tag sollten mit Anmerkungen versehen und nicht signiert sein. Das alte Tag wurde mit 'git tag -a bad_tag_name' erstellt, daher möchte ich etwas in Anlehnung an 'git tag -a good_tag_name' tun.
Brandon Fosdick
Ich möchte darauf hinweisen, dass ich auch möchte, dass dieser magische Umbenennungsprozess für Tags die Anmerkung des umbenannten Tags beibehält. Eigentlich möchte ich wirklich nur den Namen und sonst nichts ändern.
Brandon Fosdick
7
git log --oneline --decorate --graphist hilfreich beim Bereinigen von Tags.
Joel Purra
Sie können ein Tag in einer Zeile umbenennen: siehe meine Antwort unten
VonC

Antworten:

2039

So benenne ich ein Tag um oldin new:

git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags

Der Doppelpunkt im Push-Befehl entfernt das Tag aus dem Remote-Repository. Wenn Sie dies nicht tun, erstellt Git beim Ziehen das alte Tag auf Ihrem Computer.

Stellen Sie schließlich sicher, dass die anderen Benutzer das gelöschte Tag entfernen. Bitte fordern Sie sie (Mitarbeiter) auf, den folgenden Befehl auszuführen:

git pull --prune --tags

Beachten Sie, dass Sie beim Ändern eines mit Anmerkungen versehenen Tags sicherstellen müssen, dass der neue Tag-Name auf das zugrunde liegende Commit verweist und nicht auf das alte mit Anmerkungen versehene Tag-Objekt, das Sie löschen möchten. Verwenden Sie daher git tag -a new old^{}anstelle von git tag new old(Dies liegt daran, dass mit Anmerkungen versehene Tags Objekte sind, während Lightweight-Tags dies nicht sind. Weitere Informationen finden Sie in dieser Antwort ).

Casey Watson
quelle
19
Wenn das Tag mit Anmerkungen versehen ist, enthält das neue Tag nicht die Nachricht des alten, aber es ist eine hilfreiche Information
NickSoft
25
@NickSoft, ich habe gerade das oben genannte mit kommentierten Tags gemacht. Die Nachrichten wurden problemlos von alt nach neu kopiert. Vielleicht habe ich eine neuere Version von Git?
Katyhuff
25
git push origin :refs/tags/oldkann vereinfacht werden, git push origin :olddenke ich.
Jesse Glick
25
Ich würde vorschlagen, "git push --tags" zu ändern, um dieses Tag "git push origin refs / tags / new" expliziter zu gestalten. Sie möchten nicht versehentlich andere Tags pushen.
Chrish
11
Warnung : Mit git tag new oldwird ein Tag erstellt, das auf das alte Tag verweist, nicht auf das Commit des alten Tags. (Siehe Warum kann ich mein Tag nicht von der Git-
Benutzeroberfläche auschecken
297

Die ursprüngliche Frage war, wie ein Tag umbenannt werden kann, was einfach ist: Erstellen Sie zuerst NEW als Alias ​​von OLD: git tag NEW OLDLöschen Sie dann OLD:git tag -d OLD .

Das Zitat in Bezug auf "den Git-Weg" und (In-) Vernunft ist falsch, da es darum geht, einen Tag-Namen beizubehalten, ihn jedoch auf einen anderen Repository-Status verweisen zu lassen.

Greg McGary
quelle
3
Die obige Antwort ist etwas vorzuziehen, da sie das git push originGeschäft einschließt .
Roly
Am einfachsten ist es, ein früheres Release-Tag umzubenennen, das mit Gitflow
RousseauAlexandre
5
Warnung : Mit git tag new oldwird ein Tag erstellt, das auf das alte Tag verweist, nicht auf das Commit des alten Tags. (Siehe Warum kann ich mein Tag nicht von der Git-
Benutzeroberfläche auschecken
118

Neben den anderen Antworten:

Zuerst müssen Sie einen Alias des alten Tag-Namens erstellen , der auf das ursprüngliche Commit verweist:

git tag new old^{}

Dann müssen Sie die alte lokal löschen :

git tag -d old

Löschen Sie dann das Tag an Ihren Remote-Standorten:

# Check your remote sources:
git remote -v
# The argument (3rd) is your remote location,
# the one you can see with `git remote`. In this example: `origin`
git push origin :refs/tags/old

Schließlich müssen Sie Ihr neues Tag zum Remotestandort hinzufügen. Bis Sie dies getan haben, werden die neuen Tags nicht hinzugefügt:

git push origin --tags

Iterieren Sie dies für jeden entfernten Standort.

Beachten Sie die Auswirkungen einer Git-Tag-Änderung auf die Verbraucher eines Pakets!

Kaiser
quelle
Warnung : Mit git tag new oldwird ein Tag erstellt, das auf das alte Tag verweist, nicht auf das Commit des alten Tags. (Siehe Warum kann ich mein Tag nicht von der Git-
Benutzeroberfläche auschecken
1
@StevenVascellaro Danke für den Link. Bitte reichen Sie für das nächste Mal eine Bearbeitung ein - das Beantworten ist ebenfalls eine Gemeinschaftsanstrengung. Vielen Dank.
Kaiser
Ich habe keine Bearbeitung vorgenommen, da ich den Code noch nicht selbst getestet habe. (Beachten Sie das Einreichungsdatum auf der verknüpften Frage)
Stevoisiak
Sobald wir dies tun git tag new old^{}, brauchen wir nicht git tag new_tag_name old_tag_name(den ersten Schritt).
Nummer 945
28

Wenn es veröffentlicht ist, können Sie es nicht löschen (ohne zu riskieren, dass es geteert und gefiedert wird). Der 'Git Weg' ist zu tun:

Das Vernünftige. Gib einfach zu, dass du es vermasselt hast und benutze einen anderen Namen. Andere haben bereits einen Tag-Namen gesehen, und wenn Sie den gleichen Namen behalten, befinden Sie sich möglicherweise in der Situation, dass zwei Personen beide "Version X" haben, aber tatsächlich unterschiedliche "X". Nennen Sie es einfach "X.1" und fertig.

Alternative,

Das Wahnsinnige. Sie möchten die neue Version auch wirklich "X" nennen, obwohl andere die alte bereits gesehen haben. Verwenden Sie also einfach git-tag -f erneut, als hätten Sie das alte noch nicht veröffentlicht.

Es ist so verrückt, weil:

Git ändert (und sollte es auch nicht) Tags hinter den Benutzern zurück. Wenn also jemand bereits das alte Etikett hat, sollte ein Git-Pull an Ihrem Baum nicht dazu führen, dass er das alte überschreibt.

Wenn jemand ein Release-Tag von Ihnen erhalten hat, können Sie das Tag nicht einfach ändern, indem Sie Ihr eigenes aktualisieren. Dies ist ein großes Sicherheitsproblem, da die Benutzer ihren Tag-Namen vertrauen müssen. Wenn du wirklich das Wahnsinnige tun willst, musst du dich nur damit abfinden und den Leuten sagen, dass du es vermasselt hast.

Mit freundlicher Genehmigung der Manpages .

Robert Munteanu
quelle
6
Oder Sie können dieses falsch benannte Tag (mit dem richtigen Namen) markieren.
Jakub Narębski
6
Danke, ich war schon eine Million Mal auf dieser Manpage. Glücklicherweise wurde das schlechte Tag nirgendwo veröffentlicht. Auch wenn es so war, ist dies ein internes Projekt und ich bin der einzige Entwickler (im Moment). Ich denke, ich bin ziemlich sicher vor dem Teern und dem Auslaufen, aber nur, wenn ich das Repo dazu bringen kann, dass es zu den Dokumenten passt.
Brandon Fosdick
Ich verwende manchmal Tags für meine persönlichen Referenzen. Z.B. Es könnte ein 'ok_jb'-Tag sein. Ich benutze dies, weil einige der Leute, mit denen ich zusammenarbeite, nicht für meine Plattform bauen können, so dass manchmal Build-Fehler auftreten. Ich kann dann schnell eine Version erhalten, die erstellt wird, indem ich dieses Tag auschecke. Wenn die neuen Quellen erstellt werden, verschiebe ich einfach das Tag oder benenne es in Builds ## um, wobei ## eine Zahl ist (abhängig vom Projekt). Ich kann auch betonen, wann eine spezielle Funktion eingeführt wurde, indem ich ein Tag hinzufüge.
7
Schlechte Antwort. "Tu es nicht" ist niemals die richtige Antwort auf "Wie kann ich das tun?". Der Benutzer hat nicht gefragt, ob Sie dies für eine gute Idee halten oder ob die Leute das mögen. Wenn jemand fragt "Wie kann ich meine Hand abschneiden?", Sagen Sie ihm entweder, wie es gemacht wird, oder lassen Sie ihn in Ruhe, aber er braucht niemanden, der ihm sagt, dass das Schneiden einer Hand möglicherweise keine so gute Idee ist. Und du kannst es schaffen. Sie können ein neues Tag hinzufügen und das alte löschen. Dies ist technisch möglich, auch in einem Remote-Repository.
Mecki
5
Dies scheint die Frage zu beantworten: "Wie kann ich ein vorhandenes Tag auf eine andere Revision verweisen lassen?" anstelle der Frage des OP: "Wie benenne ich ein Tag um?" Es ist auch unklar, wie das Problem gelöst werden kann, wenn man den Leuten sagt, dass man es vermasselt hat (obwohl es im Allgemeinen eine gute Idee ist).
LarsH
25

Diese Wiki-Seite hat diesen interessanten Einzeiler, der uns daran erinnert, dass wir mehrere Refs pushen können :

git push origin <refs/tags/old-tag>:<refs/tags/new-tag> :<refs/tags/old-tag> && git tag -d <old-tag>

und andere Kloner bitten, dies zu tun git pull --prune --tags

Die Idee ist also zu pushen:

  • <new-tag>für alle Commits, auf die verwiesen wird von <old-tag> : <refs/tags/old-tag>:<refs/tags/new-tag>,
  • die Streichung von<old-tag> ::<refs/tags/old-tag>

Siehe als Beispiel " Namenskonvention von Tags in einem Git-Repository ändern? ".

VonC
quelle
Erhält dies Anmerkungen?
Brandon Fosdick
1
Beachten Sie, dass der ursprüngliche Tag-Name in der Anmerkung für kommentierte Tags verbleibt !! Ich bin mir nicht sicher, ob das tatsächlich etwas impliziert, zumindest in den aktuellen Versionen.
gbr
@gbr Können Sie die Antwort mit einem Beispiel bearbeiten, das zeigt, dass der "ursprüngliche Tag-Name" in der Anmerkung verbleibt?
VonC
1
@VonC Ich bin nicht sicher, ob ich verstehe, was Sie fragen. Vielleicht war mir nicht klar: Die Anmerkungsobjekte enthalten ein Tag- Feld, das auf den Namen des Tags gesetzt ist. Sie können es damit sehen git cat-file -p <tag>. Mit Ihrer Methode auf meinem System erhalte ich zwar das 'umbenannte' Tag ref ( <new-tag>), aber das Tag- Feld ist noch vorhanden <old-tag>.
gbr
3
@gbr Wollte das OP nicht? Er erwähnte "Ich sollte darauf hinweisen, dass ich auch möchte, dass dieser magische Tag-Umbenennungsprozess die Annotation des umbenannten Tags beibehält . Eigentlich möchte ich wirklich nur den Namen und nichts anderes ändern" ( stackoverflow.com/questions/1028649/). How-Do-You-Rename-A-Git-Tag /… )
VonC
25

Als Ergänzung zu den anderen Antworten habe ich einen Alias ​​hinzugefügt, um alles in einem Schritt zu erledigen, mit einem vertrauten Gefühl des * nix-Bewegungsbefehls. 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' -"

Verwendungszweck:

git renametag old new
Jared Knipp
quelle
Dies funktionierte bei mir nicht, da es bei fehlschlug !sh(Frage betraf Windows Git), aber nach dem Aktualisieren des Formats auf Folgendes funktionierte es : renametag = "!f() { git tag $2 $1; git tag -d $1; git push origin :refs/tags/$1; git push --tags; }; f".
Sunny Patel
10

Befolgen Sie den dreistufigen Ansatz für ein oder mehrere Tags.

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

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

Schritt 2: Löschen Sie das Tag 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 das alte Tag zeigte

     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 der lokale Git mit der Änderung des Tag-Namens fertig ist, können diese Änderungen an den Ursprung zurückgeschoben werden, damit andere sie übernehmen können.

Vikas Pachisia
quelle
Es fehlen Schritte, um gelöschte Tags zurückzuschieben: git push origin :refs/tags/v0.1.0-Demound Tags zurückzuschieben (mit anderen ausstehenden Dingen)git push --tags
Star Wolf
6

Für die Abenteuerlustigen kann es in einem Befehl ausgeführt werden:

mv .git/refs/tags/OLD .git/refs/tags/NEW
wolfc
quelle
7
Dies wird nicht funktionieren, wenn Ihre Refs gepackt sind, dh wenn Sie vor git gckurzem gelaufen sind
forivall
2
Dies wirkt sich auch nur auf das lokale Repo aus. Wenn Sie eine Fernbedienung konfiguriert haben, bin ich mir nicht sicher, welche negativen Auswirkungen dies haben könnte. Ich empfehle diesen Ansatz nicht.
Therealklanni
1
Beachten Sie auch, dass dies für kommentierte Tags wahrscheinlich noch problematischer ist, da der Blot "Annotation" unter anderem den ursprünglichen Namen des Tags enthält. Eigentlich bin ich mir nicht sicher, ob das von irgendetwas verwendet wird (hoffentlich zumindest von Verify-Tag), aber ich würde kein Risiko eingehen.
Gbr
1
@gbr Dies funktioniert einwandfrei. (Natürlich ist der Hinweis von @forivall zu berücksichtigen.) Dieser Trick wird im ALT Sisyphus-Build-System seit Ewigkeiten massiv verwendet. Sehen Sie sich an, wie die Quellen für ein Paket gespeichert sind, z . B.: Git.altlinux.org/gears/g/gear.git . Die lesbaren Tags wie 2.0.7-alt1 sind die signierten Tags, die von den Betreuern an das Build-System gesendet werden. Die kryptischen Tags gb-sisyphus-task164472.200 werden vom Build-System dort abgelegt, um die Task-ID zu verfolgen, die das Paket aus dieser Quelle erstellt und veröffentlicht hat. Es handelt sich um dumme Kopien ( cp), bei denen die Nachricht des Betreuers unberührt bleibt.
imz - Ivan Zakharyaschev
@ imz - IvanZakharyaschev Gut zu wissen, ich würde nicht zu viel Vertrauen setzen, dass es in Zukunft bei einigen Produkten nicht zu Problemen kommen wird. Es gibt keine wirkliche Spezifikation des Git-Repositories-Formats und der erwarteten Interaktion. Wenn es also
machbar ist,
3

Unabhängig von den Problemen beim Verschieben von Tags und beim Umbenennen von Tags, die bereits verschoben wurden, können Sie das zu umbenennende Tag, falls es sich um ein kommentiertes Tag handelt, zunächst mithilfe der folgenden einzeiligen Befehlszeile kopieren:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}

Dann müssen Sie nur noch das alte Tag löschen:

git tag -d old_tag

Ich habe diese Befehlszeile dank der folgenden zwei Antworten gefunden:

Bearbeiten:
Nachdem Probleme bei der automatischen Synchronisierung der Tag-Einstellungen aufgetreten sind fetch.pruneTags=true(wie unter https://stackoverflow.com/a/49215190/7009806 beschrieben ), empfehle ich persönlich, zuerst das neue Tag auf den Server zu kopieren und dann das alte zu löschen. Auf diese Weise wird das neue Tag beim Löschen des alten Tags nicht zufällig gelöscht, und eine Synchronisierung der Tags möchte das neue Tag löschen, das sich noch nicht auf dem Server befindet . So bekommen wir zum Beispiel alle zusammen:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
git push --tags
git tag -d old_tag
git push origin :refs/tags/old_tag
Olivier
quelle
3

Sie können Remote-Tags auch umbenennen, ohne sie auszuchecken, indem Sie das alte Tag / den alten Zweig in einen neuen Namen duplizieren und den alten in einem einzigen löschen git push .

Remote - Tag Umbenennungs / Remote Zweig → Tag Umwandlung: (Hinweis: :refs/tags/)

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

Remote - Zweig Umbenennungs / Remote - Tag → Zweig Umwandlung: (Hinweis: :refs/heads/)

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

Ausgabe zum Umbenennen eines Remote-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
Zionyx
quelle