Jak usunąć tag Git, który został już wypchnięty?
Wystarczy wcisnąć „puste” odwołanie do nazwy zdalnego znacznika:
git push origin :tagname
Lub, bardziej konkretnie , użyj --delete
opcji (lub -d
jeśli Twoja wersja git jest starsza niż 1.8.0):
git push --delete origin tagname
Zauważ, że git ma przestrzeń nazw znaczników i przestrzeń nazw gałęzi, więc możesz użyć tej samej nazwy dla gałęzi i znacznika. Jeśli chcesz się upewnić, że nie możesz przypadkowo usunąć gałęzi zamiast tagu, możesz podać pełne odwołanie, które nigdy nie usunie gałęzi:
git push origin :refs/tags/tagname
Jeśli musisz również usunąć tag lokalny, użyj:
git tag --delete tagname
Przekazywanie gałęzi, znacznika lub innego odwołania do zdalnego repozytorium wymaga określenia „które repozytorium, jakie źródło, jakie miejsce docelowe?”
git push remote-repo source-ref:destination-ref
Przykładem świata rzeczywistego, w którym wypychasz gałąź master do gałęzi master źródła, jest:
git push origin refs/heads/master:refs/heads/master
Które z powodu domyślnych ścieżek można skrócić do:
git push origin master:master
Tagi działają w ten sam sposób:
git push origin refs/tags/release-1.0:refs/tags/release-1.0
Które można również skrócić do:
git push origin release-1.0:release-1.0
Pomijając źródło ref (część przed dwukropkiem), wypychasz „nic” do miejsca docelowego, usuwając ref na odległym końcu.
git push --delete origin tag1 tag2
. To samo dotyczy usuwania tagów lokalnychgit tag -d tag1 tag2
tag
jest dołączony tylko do jednego zatwierdzenia. Z tego powodu nazwa oddziału jest nieistotna.git tag -d `git tag`
usuniesz wszystkie lokalne tagi. To samo dotyczygit push --delete origin `git tag`
założenia, że ściągnąłeś zdalne tagi lokalnie. Było to przydatne w środowisku testowym.Prostszym sposobem jest
Składnia dwukropka przed IMO jest w tej sytuacji trochę dziwna
źródło
git push --delete origin "TAGNAME"
gdzie TAGNAME to nazwa oryginalnego tagu.tag
przed nazwą tagu, aby mieć pewność, że otrzymasz tag, a nie gałąź.refs/tags/
coś takiego:refs/tags/v2.3.1
.Jeśli masz zdalny tag
v0.1.0
do usunięcia, a Twój pilot toorigin
, to po prostu:Jeśli musisz także usunąć tag lokalnie:
Zobacz odpowiedź Adama Franco , aby uzyskać wyjaśnienie niezwykłej
:
składni Git do usuwania.źródło
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...?:tagname
powinien działać na zdalne usunięcie.Usuń wszystkie tagi lokalne i uzyskaj listę zdalnych tagów :
Usuń wszystkie zdalne tagi
Wyczyść tagi lokalne
źródło
Aby usunąć znacznik ze zdalnego repozytorium:
Możesz także chcieć usunąć tag lokalnie:
źródło
git push --delete origin TAGNAME && git tag -d TAGNAME
Z poziomu terminala wykonaj następujące czynności:
Teraz przejdź do Github.com i odśwież, znikają.
źródło
your_tag_name
z lokalnego repozytorium.your_tag_name
z zdalnego repo.źródło
Usuń lokalny tag „12345”
Usuń zdalny tag „12345” (np. Również wersja GitHub)
alternatywne podejście
źródło
Zauważ, że jeśli masz zdalną gałąź o nazwie jako tag zdalny, poniższe polecenia są niejednoznaczne:
Musisz więc użyć tego polecenia, aby usunąć znacznik:
i ten, aby usunąć gałąź:
Jeśli nie, pojawi się taki błąd:
źródło
Do 100 razy szybsza metoda dla tysięcy zdalnych tagów
Po przeczytaniu tych odpowiedzi i konieczności usunięcia ponad 11 000 tagów, nauczyłem się, że te metody polegają lub
xargs
trwają zbyt długo, chyba że masz godziny na spalenie.Walcząc, znalazłem dwa znacznie szybsze sposoby. W obu przypadkach zacznij od
git tag
lub,git ls-remote --tags
aby utworzyć listę znaczników, które chcesz usunąć na pilocie. W poniższych przykładach możesz pominąć lub zamienić nasorting_proccessing_etc
dowolnegrep
ing,sort
ing,tail
ing lubhead
ing ( np.grep -P "my_regex" | sort | head -n -200
Itp. ):Ta pierwsza metoda jest zdecydowanie najszybsza, może od 20 do 100 razy szybsza niż użycie
xargs
i działa z co najmniej kilkoma tysiącami tagów jednocześnie.Jak to działa? Normalna lista tagów oddzielonych wierszami jest konwertowana na jeden wiersz tagów oddzielonych spacjami, każdy poprzedzony znakiem „
:
tak”. . .Używanie
git push
z tym formatem tagów nie wpycha niczego do każdego zdalnego odwołania, usuwając go (normalny format do przekazywania w ten sposób tolocal_ref_path:remote_ref_path
).Metoda druga jest oddzielną odpowiedzią w innym miejscu na tej samej stronie
Po zastosowaniu obu tych metod prawdopodobnie prawdopodobnie również chcesz usunąć tagi lokalne. Jest to o wiele szybsze, więc możemy wrócić do używania
xargs
igit tag -d
, co jest wystarczające.LUB podobny do zdalnego usuwania:
źródło
Jeśli używasz SourceTree - świetnego GUI Git - możesz to łatwo zrobić bez wiersza poleceń, wykonując następujące czynności:
YOUR_TAG_NAME zostanie teraz usunięty z lokalnego repozytorium i wszystkich pilotów - czy to GitHub, BitBucket, czy gdziekolwiek indziej wymieniony jako zdalny dla tego repozytorium.
Ponadto, jeśli usunąłeś znacznik lokalnie, ale nie ze zdalnego źródła, i chcesz go usunąć wszędzie, po prostu utwórz nowy znacznik, który ma tę samą nazwę i jest dołączony do tego samego zatwierdzenia co źródła. Następnie powtórz powyższe kroki, aby usunąć wszędzie.
źródło
Jeśli utworzyłeś znacznik wywoływany
release01
w repozytorium Git, usuniesz go z repozytorium, wykonując następujące czynności:Aby usunąć jeden z repozytorium Mercurial:
Proszę odnieść się do https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
źródło
Jeśli używasz programu PowerShell i chcesz usunąć kilka z nich:
Oczywiście możesz je również przefiltrować przed usunięciem:
źródło
Zgodnie z sugestią @CubanX, podzieliłem tę odpowiedź z mojego oryginału:
Oto metoda, która jest kilka razy szybsza niż ta
xargs
i może skalować się znacznie bardziej z poprawkami. Korzysta z Github API , osobistego tokena dostępu i wykorzystuje narzędzieparallel
.parallel
ma wiele trybów pracy, ale generalnie równolegle do każdej wydanej komendy, jednocześnie pozwalając ustawić limity liczby procesów. Możesz zmienić ten--jobs 2
parametr, aby umożliwić szybsze działanie, ale miałem problemy z limitami prędkości Github , które obecnie wynoszą 5000 / godz., Ale wydaje się, że również mam nieudokumentowany limit krótkoterminowy.Po tym prawdopodobnie prawdopodobnie będziesz chciał również usunąć tagi lokalne. Jest to o wiele szybsze, więc możemy wrócić do używania
xargs
igit tag -d
, co jest wystarczające.źródło
Inne odpowiedzi wskazują, jak to osiągnąć, ale należy pamiętać o konsekwencjach, ponieważ jest to zdalne repozytorium.
Strona podręcznika git tag w On Retagging , dobrze wyjaśnia, jak uprzejmie poinformować innych użytkowników zdalnego repo o zmianie. Dają nawet przydatny szablon ogłoszenia do komunikowania, w jaki sposób inni powinni uzyskać twoje zmiany.
źródło
Chciałem usunąć wszystkie tagi oprócz tych, które pasują do wzorca, abym mógł usunąć wszystkie tagi produkcyjne oprócz ostatnich kilku miesięcy, oto co przyniosłem z wielkim sukcesem:
Usuń wszystkie zdalne tagi i wyklucz wyrażenie z Usuń
Usuń wszystkie lokalne tagi i wyklucz wyrażenie z Usuń
źródło
Prosty skrypt do usunięcia podanego tagu z lokalizacji lokalnej i źródłowej. Sprawdzanie, czy tag naprawdę istnieje.
Jak używać:
źródło
Wydaje się, że dużo pracy nad czymś, co
xargs
już robi. Patrząc wstecz na ten wątek, domyślam się, że powolność, zxargs
którą się spotkałeś, jest spowodowana pierwotną odpowiedzią,xargs -n 1
kiedy tak naprawdę nie było takiej potrzeby.Jest to równoważne z twoją metodą, z tym wyjątkiem, że
xargs
automatycznie zajmuje się maksymalną długością wiersza poleceń:xargs
potrafi również uruchamiać procesy równolegle. Metoda 2 zxargs
:Powyższe wykorzystuje maksymalnie 5 procesów do obsługi maksymalnie 100 argumentów w każdym procesie. Możesz eksperymentować z argumentami, aby znaleźć to, co najlepiej pasuje do twoich potrzeb.
źródło
Jeśli masz znacznik utworzony od znaku # , np.
#ST002
Możesz stwierdzić, że nie możesz go usunąć przy użyciu normalnych wzorców. to znaczyNie usunie znacznika, ale zawinie go w literały łańcuchowe w ten sposób
To spowoduje jego usunięcie. Mam nadzieję, że pomoże to komuś, kto popełnił błąd przy użyciu # do pisania nazw znaczników.
źródło
Oto lokalna skrzynka testowa do testowania lokalnego bez bałagania za pomocą pilota:
źródło
Cześć, chciałem tylko udostępnić utworzony alias, który robi to samo:
Dodaj następujące elementy do ~ / .gitconfig
Użycie wygląda następująco:
źródło