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

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.


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

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.


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.


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

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.


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)

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

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


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 $_ 
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.