Wie löscht man ein Git-Tag, das bereits gepusht wurde?
Sie müssen nur einen 'leeren' Verweis auf den Namen des Remote-Tags senden:
git push origin :tagname
Oder verwenden Sie ausdrücklich die --delete
Option (oder -d
wenn Ihre Git-Version älter als 1.8.0 ist):
git push --delete origin tagname
Beachten Sie, dass git über einen Tag-Namespace und einen Branch-Namespace verfügt, sodass Sie für einen Branch und ein Tag denselben Namen verwenden können. Wenn Sie sicherstellen möchten, dass Sie den Zweig nicht versehentlich anstelle des Tags entfernen können, können Sie eine vollständige Referenz angeben, die niemals einen Zweig löscht:
git push origin :refs/tags/tagname
Wenn Sie auch das lokale Tag löschen müssen, verwenden Sie:
git tag --delete tagname
Wenn Sie einen Zweig, ein Tag oder einen anderen Verweis in ein Remote-Repository verschieben, müssen Sie angeben, welches Repo, welche Quelle, welches Ziel?
git push remote-repo source-ref:destination-ref
Ein Beispiel aus der Praxis, bei dem Sie Ihren Hauptzweig in den Hauptzweig des Ursprungs verschieben, ist:
git push origin refs/heads/master:refs/heads/master
Welche aufgrund von Standardpfaden kann verkürzt werden auf:
git push origin master:master
Tags funktionieren genauso:
git push origin refs/tags/release-1.0:refs/tags/release-1.0
Was auch gekürzt werden kann zu:
git push origin release-1.0:release-1.0
Wenn Sie die Quellreferenz (den Teil vor dem Doppelpunkt) weglassen, drücken Sie "nichts" zum Ziel und löschen die Referenz auf der Remote-Seite.
git push --delete origin tag1 tag2
. Gleiches gilt für das Löschen lokaler Tagsgit tag -d tag1 tag2
tag
ist nur einem einzelnen Commit zugeordnet. Aus diesem Grund ist der Filialname irrelevant.git tag -d `git tag`
alle lokalen Tags gelöscht werden. Gleiches gilt für diegit push --delete origin `git tag`
Annahme, dass Sie die Remote-Tags lokal abgerufen haben. Das war praktisch in einer Testumgebung.Ein einfacher Weg ist
Die Syntax des IMO-Präfix-Doppelpunkts ist in dieser Situation etwas seltsam
quelle
git push --delete origin "TAGNAME"
wobei TAGNAME der Name des ursprünglichen Tags ist.tag
vor Ihren Tag-Namen setzen, um sicherzustellen, dass Sie das Tag und nicht den Zweig erhalten.refs/tags/
:refs/tags/v2.3.1
.Wenn Sie ein Remote-Tag
v0.1.0
zum Löschen haben und Ihr Remote istorigin
, dann einfach:Wenn Sie das Tag auch lokal löschen müssen:
In der Antwort von Adam Franco finden Sie eine Erklärung der ungewöhnlichen
:
Löschsyntax von Git .quelle
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...?:tagname
für die Fernlöschung funktionieren.Löschen Sie alle lokalen Tags und rufen Sie die Liste der Remote-Tags ab :
Entfernen Sie alle Remote-Tags
Bereinigen Sie lokale Tags
quelle
So entfernen Sie das Tag aus dem Remote-Repository:
Möglicherweise möchten Sie das Tag auch lokal löschen:
quelle
git push --delete origin TAGNAME && git tag -d TAGNAME
Gehen Sie von Ihrem Terminal aus folgendermaßen vor:
Gehen Sie jetzt zu Github.com und aktualisieren Sie, sie verschwinden.
quelle
your_tag_name
aus dem lokalen Repo gelöscht.your_tag_name
aus Remote- Repo.quelle
Lokales Tag '12345' löschen
Remote-Tag '12345' löschen (zB GitHub-Version auch)
alternativer Ansatz
quelle
Beachten Sie nur, dass diese Befehle nicht eindeutig sind, wenn Sie einen Remote-Zweig haben, der als Remote-Tag bezeichnet wird:
Sie müssen diesen Befehl also verwenden, um das Tag zu löschen:
und dieser, um den Zweig zu löschen:
Wenn nicht, würden Sie eine Fehlermeldung wie folgt erhalten:
quelle
Bis zu 100-mal schnellere Methode für Tausende von Remote-Tags
Nachdem ich diese Antworten gelesen hatte und mehr als 11.000 Tags löschen musste, lernte ich, dass diese Methoden zuverlässig sind oder
xargs
viel zu lange dauern, es sei denn, Sie haben Stunden zum Brennen.Ich kämpfte und fand zwei viel schnellere Wege. Beginnen Sie für beide mit
git tag
odergit ls-remote --tags
erstellen Sie eine Liste der Tags, die Sie auf der Fernbedienung löschen möchten. In den folgenden Beispielen können Sie alles weglassen oder durch einsorting_proccessing_etc
beliebigesgrep
Ing,sort
Ing,tail
Ing oderhead
Ing ersetzen ( z. B.grep -P "my_regex" | sort | head -n -200
usw. ):Diese erste Methode ist bei weitem die schnellste, vielleicht 20- bis 100-mal schneller als die Verwendung
xargs
und funktioniert mit mindestens mehreren tausend Tags gleichzeitig.Wie funktioniert das? Die normale, durch Zeilen getrennte Liste von Tags wird in eine einzelne Zeile mit durch Leerzeichen getrennten Tags konvertiert, denen jeweils solche vorangestellt
:
sind. . .Wenn Sie
git push
dieses Format-Tag verwenden, wird nichts in jede Remote-Referenz verschoben und gelöscht (das normale Format für das Verschieben auf diese Weise istlocal_ref_path:remote_ref_path
).Methode zwei wird an anderer Stelle auf derselben Seite als separate Antwort aufgeführt
Nach diesen beiden Methoden möchten Sie wahrscheinlich auch Ihre lokalen Tags löschen. Dies ist viel schneller, so dass wir wieder auf
xargs
und zurückgreifen könnengit tag -d
, was ausreicht.ODER ähnlich wie beim Remote-Löschen:
quelle
Wenn Sie SourceTree - eine großartige Git-GUI - verwenden, können Sie dies ganz einfach ohne Befehlszeile tun, indem Sie Folgendes tun:
YOUR_TAG_NAME wird nun aus Ihrem lokalen Repository und allen Fernbedienungen entfernt - sei es GitHub, BitBucket oder wo immer Sie als Remote für dieses Repository aufgeführt sind.
Wenn Sie ein Tag lokal, aber nicht auf den Remote-Ursprüngen gelöscht haben und es überall löschen möchten, erstellen Sie einfach ein neues Tag mit demselben Namen und demselben Commit wie die Ursprünge. Wiederholen Sie dann die obigen Schritte, um sie überall zu löschen.
quelle
Wenn Sie ein Tag erstellt haben, das
release01
in einem Git-Repository aufgerufen wird, entfernen Sie es wie folgt aus Ihrem Repository:So entfernen Sie eine aus einem Mercurial-Repository:
Bitte verweisen Sie auf https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
quelle
Wenn Sie PowerShell verwenden und einige davon löschen möchten:
Natürlich können Sie sie auch vor dem Löschen filtern:
quelle
Wie @CubanX vorgeschlagen hat, habe ich diese Antwort von meinem Original getrennt:
Hier ist eine Methode, die um ein Vielfaches schneller ist
xargs
und mit Optimierungen viel mehr skalieren kann. Es verwendet die Github-API , ein persönliches Zugriffstoken, und nutzt das Dienstprogrammparallel
.parallel
hat viele Betriebsmodi, parallelisiert jedoch im Allgemeinen jeden Befehl, den Sie ihm geben, und ermöglicht es Ihnen, die Anzahl der Prozesse zu begrenzen. Sie können den--jobs 2
Parameter ändern , um einen schnelleren Betrieb zu ermöglichen, aber ich hatte Probleme mit den Geschwindigkeitsbegrenzungen von Github , die derzeit bei 5000 / h liegen, aber auch eine undokumentierte kurzfristige Begrenzung zu haben scheint.Danach möchten Sie wahrscheinlich auch Ihre lokalen Tags löschen. Dies ist viel schneller, so dass wir wieder auf
xargs
und zurückgreifen könnengit tag -d
, was ausreicht.quelle
Die anderen Antworten zeigen, wie dies erreicht werden kann. Sie sollten jedoch die Konsequenzen berücksichtigen, da dies ein Remote-Repository ist.
Die Git-Tag-Manpage im Abschnitt On Retagging enthält eine gute Erklärung, wie Sie die anderen Benutzer des Remote- Repos höflich über die Änderung informieren können. Sie bieten sogar eine praktische Ankündigungsvorlage, mit der Sie kommunizieren können, wie andere Ihre Änderungen erhalten sollen.
quelle
Ich wollte alle Tags entfernen, mit Ausnahme derjenigen, die einem Muster entsprechen, damit ich alle bis auf die letzten Monate der Produktions-Tags löschen konnte. Folgendes habe ich mit großem Erfolg verwendet:
Löschen Sie alle Remote-Tags und schließen Sie den Ausdruck vom Löschen aus
Alle lokalen Tags löschen und Ausdruck vom Löschen ausschließen
quelle
Einfaches Skript zum Entfernen eines bestimmten Tags von lokalen und Ursprungsorten. Mit einer Überprüfung, ob das Tag wirklich existiert.
Wie benutzt man:
quelle
Scheint, als ob eine Menge Arbeit für etwas
xargs
bereits erledigt ist. Wenn ich durch diesen Thread zurückblicke, schätze ich, dass die Langsamkeitxargs
, die Sie erlebt haben, darin besteht, dass die ursprüngliche Antwort verwendet wurde,xargs -n 1
als es nicht wirklich nötig war.Dies entspricht Ihrer Methode 1,
xargs
mit der Ausnahme, dass automatisch die maximale Befehlszeilenlänge berücksichtigt wird:xargs
kann auch Prozesse parallel ausführen. Methode 2 mitxargs
:Das obige Verfahren verwendet maximal 5 Prozesse, um maximal 100 Argumente in jedem Prozess zu verarbeiten. Sie können mit den Argumenten experimentieren, um herauszufinden, was für Ihre Anforderungen am besten geeignet ist.
quelle
Wenn Sie ein Tag erstellt haben, das mit dem Zeichen # beginnt
#ST002
, können Sie möglicherweise feststellen, dass Sie nicht mit normalen Mustern löschen können. dhLöscht das Tag nicht, sondern verpackt es wie folgt in ein String-Literal
Dadurch wird es gelöscht. In der Hoffnung, dass es jemandem hilft, der den Fehler gemacht hat, # zum Schreiben von Tag-Namen zu verwenden.
quelle
Hier ist ein lokaler Testfall, um ihn lokal zu testen, ohne mit einer Fernbedienung zu spielen:
quelle
Hallo, ich wollte nur einen Alias teilen, den ich erstellt habe und der dasselbe tut:
Fügen Sie Ihrer ~ / .gitconfig Folgendes hinzu
Die Verwendung sieht aus wie:
quelle