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.

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.


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

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.


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.


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 $_ }  

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.


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)

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

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


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 $_ 
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.