Wie lösche ich ein Remote-Tag?

3420

Wie löscht man ein Git-Tag, das bereits gepusht wurde?

Markdorison
quelle

Antworten:

5753

Sie müssen nur einen 'leeren' Verweis auf den Namen des Remote-Tags senden:

git push origin :tagname

Oder verwenden Sie ausdrücklich die --deleteOption (oder -dwenn 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

Hintergrund

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.

Adam Franco
quelle
187
+1 für die Beantwortung der Frage und die Erläuterung des allgemeinen Falls sowie für die detaillierte Bedeutung der ungekürzten Syntax
Peter Host
77
Und nur für den Fall, dass sich jemand fragt, wie mehrere Tags gleichzeitig gelöscht werden können, listen Sie sie einfach mit Leerzeichen auf, z git push --delete origin tag1 tag2. Gleiches gilt für das Löschen lokaler Tagsgit tag -d tag1 tag2
dVaffection
8
Wenn der Tag-Name mit einem Zweignamen kollidiert, wird möglicherweise Ihr Zweig gelöscht. Haha. Siehe die zweite Antwort - es ist ökologischer
zuba
1
@EmmaHe A tagist nur einem einzelnen Commit zugeordnet. Aus diesem Grund ist der Filialname irrelevant.
cb2
1
Es ist auch interessant zu wissen, dass git tag -d `git tag`alle lokalen Tags gelöscht werden. Gleiches gilt für die git push --delete origin `git tag`Annahme, dass Sie die Remote-Tags lokal abgerufen haben. Das war praktisch in einer Testumgebung.
DarkFranX
382

Ein einfacher Weg ist

git push --delete origin YOUR_TAG_NAME

Die Syntax des IMO-Präfix-Doppelpunkts ist in dieser Situation etwas seltsam

quexer
quelle
4
Ich denke, das ist der richtige Weg ... andere Syntaxen sehen für mich eher wie Hacks aus.
Luigi R. Viggiano
11
Ja, das ist einfach und funktioniert. Obwohl ich die Antwort klarstellen würde, indem ich spezifiziere, was der variable Teil ist: git push --delete origin "TAGNAME"wobei TAGNAME der Name des ursprünglichen Tags ist.
Teemu Leisti
12
Das funktioniert. Ein Zusatz: Wenn Sie einen Zweig und ein Tag mit demselben Namen haben, können Sie das Wort tagvor Ihren Tag-Namen setzen, um sicherzustellen, dass Sie das Tag und nicht den Zweig erhalten.
Andypaxo
9
@andypaxo Was der Befehl benötigt, ist refspecs. Der richtige Weg wäre, den Tags Folgendes voranzustellen refs/tags/: refs/tags/v2.3.1.
p3lim
Ich hatte irgendwie einen 'schlechten' Tag-Namen auf dem Remote-Server erstellt, der Sonderzeichen hatte, daher kann ich nicht damit synchronisieren. Entfernen Sie diesen einfach mit Ihrem Vorschlag: git push --delete origin "service-- <default> - 151 ", kann es nicht entfernen, nicht mit Intellij, nicht mit Stash, nicht mit SourceTree. Vielen Dank !
Dmitri Algazin
215

Wenn Sie ein Remote-Tag v0.1.0zum Löschen haben und Ihr Remote ist origin, dann einfach:

git push origin :refs/tags/v0.1.0

Wenn Sie das Tag auch lokal löschen müssen:

git tag -d v0.1.0

In der Antwort von Adam Franco finden Sie eine Erklärung der ungewöhnlichen :Löschsyntax von Git .

Alex Dean
quelle
2
Dies funktioniert auch mit jgit. das: Tag Stenographie funktioniert nicht mit JGit
rynop
Ich habe fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1...?
Chaim Eliyah
3
@ChaimEliyah Sie haben einen führenden Schrägstrich, vielleicht ist das Ihr Problem
Joffrey
5
Bessere Antwort, da dies auch funktioniert, wenn Sie einen Zweig und ein Tag haben, die gleich heißen.
Erik A. Brandstadmoen
Sollte nur :tagnamefür die Fernlöschung funktionieren.
Acumenus
106

Löschen Sie alle lokalen Tags und rufen Sie die Liste der Remote-Tags ab :

git tag -l | xargs git tag -d
git fetch

Entfernen Sie alle Remote-Tags

git tag -l | xargs -n 1 git push --delete origin

Bereinigen Sie lokale Tags

git tag -l | xargs git tag -d
Siddhartha Mukherjee
quelle
2
So entfernen Sie alle Tags aus den lokalen und Remote-Repos. Das habe ich gesucht, danke!
Jorge Orpinel
Git holen, Remote entfernen und dann Einheimische aufräumen, hat wunderbar funktioniert!
DiegoRBaquero
langsam, aber am einfachsten
Lucent Fox
33

So entfernen Sie das Tag aus dem Remote-Repository:

git push --delete origin TAGNAME

Möglicherweise möchten Sie das Tag auch lokal löschen:

git tag -d TAGNAME
Andrea
quelle
git push --delete origin TAGNAME && git tag -d TAGNAME
Also
25

Gehen Sie von Ihrem Terminal aus folgendermaßen vor:

git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}

Gehen Sie jetzt zu Github.com und aktualisieren Sie, sie verschwinden.

Mahmoud Zalt
quelle
3
Git Tag nicht Tags
DSF
23
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
  1. Erste Zeile, wird your_tag_nameaus dem lokalen Repo gelöscht.
  2. Zweite Zeile, löscht your_tag_nameaus Remote- Repo.
  3. Drücken Sie den Entwurf verwerfen Button in Ihrem GitHub Releases Abschnitt.

Geben Sie hier die Bildbeschreibung ein

Kokabi
quelle
2
Während dieser Befehl die Frage beantworten kann, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert. Wie zu antworten
Popo
20

Lokales Tag '12345' löschen

git tag -d 12345

Remote-Tag '12345' löschen (zB GitHub-Version auch)

git push origin :refs/tags/12345

alternativer Ansatz

git push --delete origin tagName
git tag -d tagName

Geben Sie hier die Bildbeschreibung ein

Lyes CHIOUKH
quelle
15

Beachten Sie nur, dass diese Befehle nicht eindeutig sind, wenn Sie einen Remote-Zweig haben, der als Remote-Tag bezeichnet wird:

git push origin :tagname
git push --delete origin tagname

Sie müssen diesen Befehl also verwenden, um das Tag zu löschen:

git push origin :refs/tags/<tag>

und dieser, um den Zweig zu löschen:

git push origin :refs/heads/<branch>

Wenn nicht, würden Sie eine Fehlermeldung wie folgt erhalten:

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
Alex Vazquez Fente
quelle
Kurz und prägnant. Dieser Beitrag zusammen mit MeganZhous war die Antwort darauf, warum wir Probleme hatten. Der Filialname und der Tagname waren identisch. Ich habe das lokale Tag gelöscht und auf: refs / tags geklickt und alles war gut.
Rwheadon
12

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 xargsviel 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 tagoder git ls-remote --tagserstellen 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 ein sorting_proccessing_etcbeliebiges grepIng, sortIng, tailIng oder headIng 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 xargsund funktioniert mit mindestens mehreren tausend Tags gleichzeitig.

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh

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. . .

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

Wenn Sie git pushdieses Format-Tag verwenden, wird nichts in jede Remote-Referenz verschoben und gelöscht (das normale Format für das Verschieben auf diese Weise ist local_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 xargsund zurückgreifen können git tag -d, was ausreicht.

git tag | sorting_processing_etc | xargs -L 1 git tag -d

ODER ähnlich wie beim Remote-Löschen:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
TonyH
quelle
Sie sollten dies in einige verschiedene Antworten aufteilen. Die Antwort mit mehreren Tags in einer Zeile ist ohne Zweifel die richtige Antwort für das Löschen von Bulk-Tags. Es ist tatsächlich ein wenig schwierig, diese Informationen fast überall zu finden. Selbst wenn ich weiß, wonach ich suche, fällt es mir schwer, es auf der Git-Hilfeseite zu finden :) Also ein großes Lob an Sie und markieren Sie dies als die richtige Antwort und verschieben Sie die GitHub-API an einen anderen Ort. Und schließlich funktioniert das Löschen von Tags lokal in großen
Mengen
Danke für das Lob und die Vorschläge. Ich werde das aufteilen. Ich verstehe Ihren Kommentar zum Löschen lokaler Tags nicht. Ich glaube nicht, dass mein letztes Befehls-Snippet Doppelpunkte verwendet, aber ich bin mobil und vermisse vielleicht etwas.
TonyH
Entschuldigung, ich habe nur gemeint, dass das, was Sie tun, um Remote-Tags zu löschen, mit dem Löschen lokaler Tags funktioniert und die gesamte Liste auf einmal bereitstellt. :) Nur anstelle von git push origin: tag1: tag2 usw. würden Sie git tag --det löschen tag1 tag2 tag3 auf diese Weise können Sie eine vollständige Bereinigung durchführen. Nochmals vielen Dank!
CubanX
11

Wenn Sie SourceTree - eine großartige Git-GUI - verwenden, können Sie dies ganz einfach ohne Befehlszeile tun, indem Sie Folgendes tun:

  1. Öffnen Sie Ihr Repository in SourceTree
  2. Wählen Sie links die Registerkarte "Tags" aus und erweitern Sie sie
  3. Klicken Sie mit der rechten Maustaste auf das Tag, das Sie löschen möchten
  4. Wählen Sie "IHREN_TAG_NAME löschen"
  5. Wählen Sie im Überprüfungsfenster "Tag von Fernbedienungen entfernen".

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.

Chris Sprague
quelle
Klappt wunderbar. Vielen Dank!
Native_Mobile_Arch_Dev
9

Wenn Sie ein Tag erstellt haben, das release01in einem Git-Repository aufgerufen wird, entfernen Sie es wie folgt aus Ihrem Repository:

git tag -d release01 
git push origin :refs/tags/release01 

So entfernen Sie eine aus einem Mercurial-Repository:

hg tag --remove featurefoo

Bitte verweisen Sie auf https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551

MeganZhou
quelle
7

Wenn Sie PowerShell verwenden und einige davon löschen möchten:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

Natürlich können Sie sie auch vor dem Löschen filtern:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
rsenna
quelle
Das war ein glattes und gutes Regexp-Beispiel. Vielen Dank, Sir
Yunus
7

Wie @CubanX vorgeschlagen hat, habe ich diese Antwort von meinem Original getrennt:

Hier ist eine Methode, die um ein Vielfaches schneller ist xargsund mit Optimierungen viel mehr skalieren kann. Es verwendet die Github-API , ein persönliches Zugriffstoken, und nutzt das Dienstprogramm parallel.

git tag | sorting_processing_etc | parallel --jobs 2 curl -i -X DELETE \ 
https://api.github.com/repos/My_Account/my_repo/git/refs/tags/{} -H 
\"authorization: token GIT_OAUTH_OR_PERSONAL_KEY_HERE\"  \
-H \"cache-control: no-cache\"`

parallelhat 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 2Parameter ä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 xargsund zurückgreifen können git tag -d, was ausreicht.

git tag | sorting_processing_etc | xargs -L 1 git tag -d
TonyH
quelle
Dies scheint viel komplizierter als die akzeptierte Antwort. Was ist der Vorteil?
theUtherSide
2
Wenn Sie mehrere tausend Tags löschen müssen, ist die Geschwindigkeit 10-100-mal schneller
TonyH
Danke für das Aufklären. Das OP fragte nach dem Löschen eines einzelnen Tags. Ich konnte mir nicht vorstellen, warum jemand diesen Ansatz für ein einzelnes Tag verwenden würde. Vielleicht ist diese Antwort besser für eine andere Frage, bei der viele Tags
gelöscht werden
Ich glaube nicht, dass es existiert. Ich könnte es schaffen, um mir selbst zu antworten. Möchten Sie das für angemessen halten?
TonyH
1
Ich mache! Ich denke, das ist hier eigentlich eine ziemlich übliche Praxis.
theUtherSide
6

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.

Richard Venable
quelle
6

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

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

Alle lokalen Tags löschen und Ausdruck vom Löschen ausschließen

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
Lucent Fox
quelle
5

Einfaches Skript zum Entfernen eines bestimmten Tags von lokalen und Ursprungsorten. Mit einer Überprüfung, ob das Tag wirklich existiert.

if [ $(git tag -l "$1") ]; then
    git tag --delete  $1
    git push --delete origin $1

    echo done.
else
    echo tag named "$1" was not found
fi

Wie benutzt man:

  • Erstellen Sie eine Shell-Skriptdatei (z. B. git-tag-purge.sh) und fügen Sie Inhalte ein.
  • Ändern Sie Ihre Skriptdatei, um sie ausführbar zu machen.
  • Machen Sie das Skript global verfügbar
  • CD zu Ihrem Git-Projekt
  • Skript aufrufen (z
    $> git-tag-purge.sh tag_name
    )
Dimitar Vlasev
quelle
4

Scheint, als ob eine Menge Arbeit für etwas xargsbereits erledigt ist. Wenn ich durch diesen Thread zurückblicke, schätze ich, dass die Langsamkeit xargs, die Sie erlebt haben, darin besteht, dass die ursprüngliche Antwort verwendet wurde, xargs -n 1als es nicht wirklich nötig war.

Dies entspricht Ihrer Methode 1, xargsmit der Ausnahme, dass automatisch die maximale Befehlszeilenlänge berücksichtigt wird:

git tag | sorting_processing_etc | xargs git push --delete origin

xargskann auch Prozesse parallel ausführen. Methode 2 mit xargs:

git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin

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.

HomerM
quelle
Interessant. Sie lernen jeden Tag etwas Neues über einen Unix-Befehl. Ich muss meinen Anwendungsfall mit dieser Alternative testen.
TonyH
4

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. dh

git tag -d #STOO2

Löscht das Tag nicht, sondern verpackt es wie folgt in ein String-Literal

git tag -d "#ST002" or git tag -d '#ST002'

Dadurch wird es gelöscht. In der Hoffnung, dass es jemandem hilft, der den Fehler gemacht hat, # zum Schreiben von Tag-Namen zu verwenden.

MernXL
quelle
2

Hier ist ein lokaler Testfall, um ihn lokal zu testen, ohne mit einer Fernbedienung zu spielen:

~/p $ mkdir gittest    
~/p/git $ cd gittest/
~/p/gittest $ git init
Initialized empty Git repository in /Users/local_user/p/gittest/.git/
 ~/p/gittest $ touch testfile.txt
 ~/p/gittest $ git add testfile.txt
 ~/p/gittest $ git commit -m "initial commit"
[master (root-commit) 912ce0e] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 testfile.txt
 ~/p/gittest $ git tag
 ~/p/gittest $ git tag -a testtag
 ~/p/gittest $ git tag
testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ cd ..
 ~/p $ mkdir gitbare
 ~/p $ cd gitbare
 ~/p/gitbare $ git init --bare
Initialized empty Git repository in /Users/local_user/p/gitbare/
 ~/p/gitbare $ cd ..
 ~/p $ cd gittest/
 ~/p/gittest $ git remote add origin /Users/local_user/p/gitbare
 ~/p/gittest $ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
 ~/p/gittest $ git push origin testtag
Counting objects: 1, done.
Writing objects: 100% (1/1), 163 bytes | 163.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new tag]         testtag -> testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ git push -d origin testtag
To /Users/local_user/p/gitbare
 - [deleted]         testtag
 ~/p/gittest    git tag -d testtag
Deleted tag 'testtag' (was b0a6c15)
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
 ~/p/gittest
Adnan Y.
quelle
1

Hallo, ich wollte nur einen Alias ​​teilen, den ich erstellt habe und der dasselbe tut:

Fügen Sie Ihrer ~ / .gitconfig Folgendes hinzu

[alias]
    delete-tag = "!f() { \
            echo 'deleting tag' $1 'from remote/origin ausing command: git push --delete origin tagName;'; \
            git push --delete origin $1; \
            echo 'deleting tag' $1 'from local using command: git tag -d tagName;'; \
            git tag -d $1; \
        }; f"

Die Verwendung sieht aus wie:

-->git delete-tag v1.0-DeleteMe
deleting tag v1.0-DeleteMe from remote/origin ausing command: git push --delete origin tagName;
To https://github.com/jsticha/pafs
 - [deleted]             v1.0-DeleteMe
deleting tag v1.0-DeleteMe from local using command: git tag -d tagName;
Deleted tag 'v1.0-DeleteMe' (was 300d3ef22)
ranma2913
quelle