Löschen Sie alle Tags aus einem Git-Repository

224

Ich möchte alle Tags aus einem Git-Repository löschen. Wie kann ich das machen?

Verwenden Sie git tag -d tagnamezum tagnamelokalen Löschen des Tags und zum git push --tagsAktualisieren der Tags auf dem Git-Anbieter.

Ich habe es versucht:

git tag -d *

Aber ich sehe, das *bedeutet die Dateien aus dem aktuellen Verzeichnis.

$ git tag -d *
error: tag 'file1' not found.
error: tag 'file2' not found.
...

Bedenken Sie, dass ich viele Tags habe und sie alle löschen möchte.

Ionică Bizău
quelle

Antworten:

418
git tag | xargs git tag -d

Verwenden Sie einfach die Linux-Philosophie, bei der Sie alles leiten. Verwenden Sie unter Windows git bash mit demselben Befehl.

Florian Margaine
quelle
135
Vielen Dank. Dieser Befehl löscht die lokalen Tags. Ich habe git tag -l | xargs -n 1 git push --delete originsie von der Fernbedienung gelöscht.
Ionică Bizău
7
Und unter Windows?
CodeManX
6
@CoDEmanX Unter Windows sollten Sie git bash mit demselben Befehl verwenden.
inf3rno
2
Löscht keine Remote-Tags, auch für Tausende von Tags sehr langsam.
Adrian Baker
1
'xargs' wird unter Windows 10
Gulzar
205

Um entfernte Tags zu löschen (bevor Sie lokale Tags löschen), gehen Sie einfach wie folgt vor:

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

und löschen Sie dann die lokalen Kopien:

git tag | xargs git tag -d
Karlingen
quelle
Das Löschen per Fernzugriff ist für Dutzende von Tags viel zu langsam.
ffxsam
4
Diese Antwort ist viel schneller, wenn Sie viele Remote-Tags haben: stackoverflow.com/a/34395864/747044
adriaan
Die Reihenfolge der Befehle in dieser Antwort setzt voraus, dass keine lokalen Tags vorhanden sind.
Acumenus
Dies ist zu langsam, unter Lösung ist besser.
Root Fool
Wenn Sie für Commits eine Passphrase eingeben müssen, ist für jedes Tag eine Passphrase erforderlich. Die andere Lösung ist besser.
Kap
55

Es kann effizienter sein, alle Tags in einem Befehl zu löschen. Besonders wenn Sie mehrere hundert haben.

Löschen Sie in einer geeigneten Nicht-Windows-Shell alle Remote-Tags:

git tag | xargs -L 1 | xargs git push origin --delete

Löschen Sie dann alle lokalen Tags:

git tag | xargs -L 1 | xargs git tag --delete

Dies sollte in Ordnung sein, solange Sie keine 'in Ihren Tag-Namen haben. Dafür sollten die folgenden Befehle OK sein.

git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git push origin --delete
git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git tag --delete

Es gibt wahrscheinlich auch andere Möglichkeiten, eine Liste von Zeilen zu erstellen, sie in Anführungszeichen zu setzen, sie zu einer einzelnen Zeile zu machen und diese Zeile dann an einen Befehl zu übergeben. In Anbetracht dessen ist dies die ultimative Umgebung für das Enthäuten von Katzen.

Richard A Quadling
quelle
3
Ich hatte mehrere tausend Tags, und das Löschen nacheinander aus einem Remote-Cloud-Repo dauerte Tage, was dadurch gelöst wurde.
Adrian Baker
Was macht das xargs -L 1?
Ymett
-L max-Zeilen --max-Zeilen [= max-Zeilen] -l [max-Zeilen] Verwenden Sie höchstens nicht leere Eingabezeilen pro Befehlszeile. Für '-l' ist max-lines standardmäßig 1, wenn es weggelassen wird. Für '-L' ist das Argument obligatorisch. Nachgestellte Leerzeichen bewirken, dass eine Eingabezeile in der nächsten Eingabezeile logisch fortgesetzt wird, um die Zeilen zu zählen. Impliziert '-x'. Die '-l'-Form dieser Option ist zugunsten der POSIX-kompatiblen' -L'-Option veraltet. gnu.org/software/findutils/manual/html_node/find_html/…
Richard A Quadling
@RichardAQuadling Ok, aber wie wirkt sich das auf die Antwort aus? git tagGibt die Tags zurück, eines pro Zeile, und xargs -L 1gibt sie dann einmal pro Zeile aus. Wozu also?
Ymett
Hmmm. Scheinbar nichts in diesem Zusammenhang! Anders als die Dinge etwas langsamer zu machen!
Richard A Quadling
24

Für Windows-Benutzer, die PowerShell verwenden:

git tag | foreach-object -process { git tag -d $_ }

Dies löscht alle zurück Tags von git tagdurch Ausführen git tag -dzurück für jede Zeile.

Stefan Domnanovits
quelle
23

Hinzufügen zu Stefans Antwort, bei der es fehlte, Tags von der Fernbedienung zu löschen. Bei Windows Powershell können Sie dies ausführen, um zuerst die Remote-Tags und anschließend die lokalen Tags zu löschen.

git tag | foreach-object -process { git push origin --delete $_ }
git tag | foreach-object -process { git tag -d $_ }  
Yong Choi
quelle
19

Wenn Sie die Tags nicht in Ihrem lokalen Repo haben, können Sie Remote-Tags löschen, ohne sie in Ihr lokales Repo bringen zu müssen.

git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete

Vergessen Sie nicht, "origin" durch den Namen Ihres Remote-Handlers zu ersetzen.

Valtoni Boaventura
quelle
Ausgezeichnet! Dies löschte sie alle auf einmal. Der andere Befehl löschte einen alle 2 Sekunden
fregante
6

Sie können auch verwenden:

git tag -d $(git tag)
ViZeke
quelle
Dies wird nicht funktionieren, wenn Sie viele Tags haben, wie Tausende
DixonD
In diesem Fall könnten Sie etwas wie: git tag -d $ (git tag | head -n 999) verwenden und es x mal ausführen
ViZeke
1

Da all diese Optionen nur unter Linux funktionieren, ist hier das Windows-Äquivalent für alle, die sich damit befassen müssen:

FOR /F usebackq %t IN (`git tag`) DO @git tag --delete %t
DarkWiiPlayer
quelle
1

Ich muss die Tags mit Präfix löschen

Zum Beispiel muss ich die Tags v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5 löschen

git tag -d $(git tag -l "v0.0.*")

Zum Auflisten aller Tags mit Präfix

git tag -l "v0.0.*"

Tags löschen

git tag -d $tag_names

So funktioniert die erste Aussage

Brady Huang
quelle
Schnell, einfach und effektiv. Hat funktioniert, danke!
Vedran Mandić vor
0

Powershell v7 unterstützt parallel foreach, wenn Sie viele Upstream-Tags (Ursprungs-Tags) haben, die Sie löschen müssen:

git tag | foreach-object -Parallel { 
git push origin --delete $_ 
git tag -d $_ 
}
Peter Rekdal Sunde
quelle