webentwicklung-frage-antwort-db.com.de

Wie benennt man ein Git-Tag um?

Heute habe ich die Protokolle nach einem Projekt durchsucht und festgestellt, dass ich vor einiger Zeit einen Markennamen gefingert habe. Gibt es eine Möglichkeit, das Tag umzubenennen? Google hat nichts Nützliches gefunden.

Mir ist klar, dass ich die getaggte Version überprüfen und ein neues Tag erstellen kann, das habe ich sogar ausprobiert. 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 mache es lieber "richtig", vorausgesetzt, es gibt einen richtigen Weg, dies zu tun.

1112
Brandon Fosdick

So benenne ich ein Tag old in new um:

git tag new old
git tag -d old
git Push Origin :refs/tags/old
git Push --tags

Der Doppelpunkt im Befehl Push 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
1862
Casey Watson

Die ursprüngliche Frage war, wie man ein Tag umbenennt, was einfach ist: erst NEU als Alias ​​von ALT erstellen: git tag NEW OLD dann ALT löschen: git tag -d OLD.

Das Zitat zu "the Git way" und (in) sanity ist falsch, da es darum geht, einen Tag-Namen beizubehalten, ihn jedoch auf einen anderen Repository-Status zu verweisen.

287
Greg McGary

Zusätzlich zu den anderen Antworten:

Zuerst müssen Sie einen Alias ​​ des alten Tag-Namens erstellen, der darauf verweist zum ursprünglichen Commit:

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 entfernten 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 an der entfernten Stelle hinzufügen. Bis Sie dies getan haben, werden die neuen Tags nicht hinzugefügt :

git Push Origin --tags

Wiederholen Sie dies für jeden entfernten Standort.

Beachten Sie die Implikationen, die eine Änderung des Git-Tags für die Konsumenten eines Pakets hat!

107
kaiser

Wenn es veröffentlicht ist, können Sie es nicht löschen (ohne zu riskieren, dass es geteert oder gefedert 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, können Sie in der Situation sein, 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. Also benutze einfach wieder git-tag -f, als hättest du das alte noch nicht veröffentlicht.

Es ist so verrückt, weil:

Git ändert (und sollte) keine Tags hinter den Benutzern zurück. Wenn also jemand bereits das alte Tag hat, sollte ein Trottel an Ihrem Baum nicht nur dazu führen, dass er das alte überschreibt.

Wenn jemand ein Release-Tag von Ihnen 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 Sie wirklich das Wahnsinnige tun wollen, müssen Sie es nur vortäuschen und den Leuten sagen, dass Sie es vermasselt haben.

Mit freundlicher Genehmigung von man pages .

27
Robert Munteanu

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 Cloner bitten, git pull --Prune --tags zu tun

Die Idee ist also, Push:

  • <new-tag> für alle Commits, auf die <old-tag> verweist: <refs/tags/old-tag>:<refs/tags/new-tag>,
  • das Löschen von <old-tag> : :<refs/tags/old-tag>

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

25
VonC

Als Ergänzung zu den anderen Antworten habe ich einen Alias ​​hinzugefügt, um alles in einem Schritt zu erledigen. 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
25
Jared Knipp

Für die Abenteurer kann es in einem Befehl gemacht werden:

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

Befolgen Sie die dreistufige Vorgehensweise für ein oder mehrere Tags.

Schritt 1: Identifizieren Sie die Festschreibungs-/Objekt-ID der Festschreibung, auf die 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 Festschreibungs-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 Origin zurückgesendet werden, damit andere sie übernehmen können.

4
vikas pachisia

Unabhängig von den Problemen beim Verschieben von Tags und Umbenennen von Tags, die bereits verschoben wurden, können Sie das zu verschiebende Tag dank der folgenden Single zunächst kopieren, falls es sich um ein kommentiertes handelt -line Kommandozeile:

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 fand diese Befehlszeile dank der folgenden zwei Antworten:

Bearbeiten:
Ich habe Probleme mit der automatischen Synchronisierung der Tags festgestellt, die fetch.pruneTags=true (wie in https://stackoverflow.com/a/49215190/7009806 ) beschrieben). Ich empfehle persönlich Kopieren Sie zuerst das neue Tag auf den Server und löschen Sie dann das alte. Auf diese Weise wird das neue Tag beim Löschen des alten Tags nicht zufällig gelöscht, und bei einer Synchronisation der Tags wird das neue Tag gelöscht, das sich noch nicht auf dem Server befindet . So erhalten 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
3
Olivier

Der einfache Teil ist das Umbenennen lokaler Tags. Der schwierigere Teil sind die entfernten. Die Idee hinter diesem Trick besteht darin, das alte Tag/den alten Zweig in einen neuen zu duplizieren und den alten zu löschen, ohne auschecken zu müssen.

Remote-Tag-Umbenennung/Remote-Zweig → Tag-Konvertierung: (Hinweis: :refs/tags/)

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

Remote-Umbenennung/Remote-Tag → Zweigkonvertierung: (Hinweis: :refs/heads/)

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

Ausgabe, die ein entferntes Tag umbenennt:

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
1
zionyx