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.