Usuń wszystkie tagi z repozytorium Git

224

Chcę usunąć wszystkie tagi z repozytorium Git. Jak mogę to zrobić?

Za git tag -d tagnamepomocą tagnamelokalnego usuwania tagu i za pomocą git push --tagsI aktualizuję tagi na dostawcy git.

Próbowałem:

git tag -d *

Ale widzę, że *to oznacza pliki z bieżącego katalogu.

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

Rozważ, że mam dużo tagów i chcę je wszystkie usunąć.

Ionică Bizău
źródło

Odpowiedzi:

419
git tag | xargs git tag -d

Po prostu użyj filozofii Linuxa, w której wszystko potokujesz. W systemie Windows użyj git bash z tym samym poleceniem.

Florian Margaine
źródło
136
Dzięki. To polecenie usuwa tagi lokalne. Kiedyś git tag -l | xargs -n 1 git push --delete origin, aby usunąć je z pilota.
Ionică Bizău
7
A w systemie Windows?
CodeManX,
7
@CoDEmanX W systemie Windows powinieneś używać git bash z tym samym poleceniem.
inf3rno
2
Nie usuwa zdalnych tagów, również bardzo wolno dla tysięcy tagów.
Adrian Baker,
1
„xargs” nie jest rozpoznawany jako polecenie wewnętrzne lub zewnętrzne w systemie Windows 10
Gulzar,
207

Aby usunąć tagi zdalne (przed usunięciem tagów lokalnych):

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

a następnie usuń lokalne kopie:

git tag | xargs git tag -d
karlingen
źródło
Zdalne usuwanie jest zbyt wolne dla dziesiątek tagów.
ffxsam,
5
Ta odpowiedź jest znacznie szybsza, jeśli masz wiele zdalnych tagów: stackoverflow.com/a/34395864/747044
adriaan
Kolejność poleceń w tej odpowiedzi zakłada, że ​​nie ma żadnych znaczników tylko lokalnych.
Acumenus
Jest to zbyt wolne, lepsze jest rozwiązanie poniżej.
Root Fool
Jeśli musisz wprowadzić hasło dla zatwierdzeń, wymaga to hasła dla każdego znacznika. Drugie rozwiązanie jest lepsze.
kap
56

Bardziej wydajne może być usunięcie wszystkich tagów za pomocą jednego polecenia. Zwłaszcza jeśli masz kilkaset.

W odpowiedniej powłoce innej niż Windows usuń wszystkie zdalne tagi:

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

Następnie usuń wszystkie lokalne tagi:

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

Powinno to być OK, o ile nie masz 'w nazwie tagu. W tym celu następujące polecenia powinny być OK.

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

Prawdopodobnie istnieją inne sposoby pobierania listy linii, zawijania ich w cudzysłowy, tworzenia pojedynczej linii, a następnie przekazywania tej linii do polecenia. Biorąc to pod uwagę, jest to najlepsze środowisko do skórowania kotów.

Richard A Quadling
źródło
3
Miałem kilka tysięcy tagów, usuwanie ich jeden po drugim ze zdalnego repozytorium chmury zajmowało dni, co rozwiązało.
Adrian Baker,
Czego xargs -L 1zrobić?
ymett
-L maks. Wierszy - maks. Wierszy [= maks. Wierszy] -l [maks. Wierszy] Należy użyć co najwyżej maks. Wierszy niepustych wierszy wejściowych na wiersz polecenia. Dla „-l” maksymalna liczba linii domyślnie wynosi 1, jeśli zostanie pominięta. Dla „-L” argument jest obowiązkowy. Końcowe spacje powodują, że linia wejściowa jest logicznie kontynuowana w następnej linii wejściowej, w celu zliczenia linii. Oznacza „-x”. Forma „-l” tej opcji jest nieaktualna na korzyść opcji „-L” zgodnej z POSIX. gnu.org/software/findutils/manual/html_node/find_html/...
Richard A Quadling
@RichardAQuadling Ok, ale jaki to ma wpływ na odpowiedź? git tagzwraca tagi, po jednym w wierszu, a następnie xargs -L 1wysyła je po jednym w wierszu, więc po co to jest?
ymett
Hmmm. Niby nic w tym kontekście! Inne niż spowalniać dotyk!
Richard A Quadling
24

Użytkownicy systemu Windows korzystający z programu PowerShell:

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

Spowoduje to usunięcie wszystkich tagów zwróconych git tagprzez wykonanie git tag -ddla każdej zwróconej linii.

Stefan Domnanovits
źródło
23

Dodanie do odpowiedzi Stefana, w której brakowało sposobu usuwania tagów ze zdalnego. W przypadku Windows PowerShell możesz uruchomić to, aby najpierw usunąć tagi zdalne, a następnie tagi lokalne.

git tag | foreach-object -process { git push origin --delete $_ }
git tag | foreach-object -process { git tag -d $_ }  
Yong Choi
źródło
19

Jeśli nie masz tagów w lokalnym repozytorium, możesz usunąć tagi zdalne bez konieczności przenoszenia go do lokalnego repozytorium.

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

Nie zapomnij zastąpić słowa „origin” nazwą użytkownika zdalnego.

Valtoni Boaventura
źródło
Doskonały! To usunęło je wszystkie za jednym razem. Drugie polecenie było usuwane co 2 sekundy
fregante
6

Możesz także użyć:

git tag -d $(git tag)
ViZeke
źródło
to nie zadziała, jeśli masz wiele tagów, takich jak tysiące
DixonD
w tym przypadku można użyć czegoś takiego: git tag -d $ (git tag | head -n 999) i wykonać to x razy
ViZeke
1

Ponieważ wszystkie te opcje działają tylko w systemie Linux, oto odpowiednik systemu Windows dla każdego, kto musi sobie z tym poradzić:

FOR /F usebackq %t IN (`git tag`) DO @git tag --delete %t
DarkWiiPlayer
źródło
1

Muszę usunąć tagi z prefiksem

na przykład muszę usunąć tagi v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5

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

Aby wyświetlić wszystkie tagi z prefiksem

git tag -l "v0.0.*"

Aby usunąć tagi

git tag -d $tag_names

Tak działa pierwsze zdanie

Brady Huang
źródło
Szybki, prosty i skuteczny. Pracowałem, dzięki!
Vedran Mandić
0

Program Powershell v7 obsługuje równoległe foreach, jeśli masz wiele znaczników w górę (pochodzenia), które musisz usunąć:

git tag | foreach-object -Parallel { 
git push origin --delete $_ 
git tag -d $_ 
}
Peter Rekdal Sunde
źródło