Jak usunąć tag Git, który został już wypchnięty?
Jak usunąć tag Git, który został już wypchnięty?
Odpowiedzi:
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 dotyczy git 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
git push --delete origin YOUR_TAG_NAME
Składnia dwukropka przed IMO jest w tej sytuacji trochę dziwna
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 to origin
, to po prostu:
git push origin :refs/tags/v0.1.0
Jeśli musisz także usunąć tag lokalnie:
git tag -d v0.1.0
Zobacz odpowiedź Adama Franco , aby uzyskać wyjaśnienie niezwykłej :
składni Git do usuwania.
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 :
git tag -l | xargs git tag -d
git fetch
Usuń wszystkie zdalne tagi
git tag -l | xargs -n 1 git push --delete origin
Wyczyść tagi lokalne
git tag -l | xargs git tag -d
Aby usunąć znacznik ze zdalnego repozytorium:
git push --delete origin TAGNAME
Możesz także chcieć usunąć tag lokalnie:
git tag -d TAGNAME
git push --delete origin TAGNAME && git tag -d TAGNAME
Z poziomu terminala wykonaj następujące czynności:
git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}
Teraz przejdź do Github.com i odśwież, znikają.
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
your_tag_name
z lokalnego repozytorium.your_tag_name
z zdalnego repo.git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
Zauważ, że jeśli masz zdalną gałąź o nazwie jako tag zdalny, poniższe polecenia są niejednoznaczne:
git push origin :tagname
git push --delete origin tagname
Musisz więc użyć tego polecenia, aby usunąć znacznik:
git push origin :refs/tags/<tag>
i ten, aby usunąć gałąź:
git push origin :refs/heads/<branch>
Jeśli nie, pojawi się taki błąd:
error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
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ć na sorting_proccessing_etc
dowolne grep
ing, sort
ing, tail
ing lub head
ing ( np. grep -P "my_regex" | sort | head -n -200
Itp. ):
xargs
i działa z co najmniej kilkoma tysiącami tagów jednocześnie.git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh
Jak to działa? Normalna lista tagów oddzielonych wierszami jest konwertowana na jeden wiersz tagów oddzielonych spacjami, każdy poprzedzony znakiem „ :
tak”. . .
tag1 becomes
tag2 ======> :tag1 :tag2 :tag3
tag3
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
).
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
i git tag -d
, co jest wystarczające.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
LUB podobny do zdalnego usuwania:
git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
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.
Jeśli utworzyłeś znacznik wywoływany release01
w repozytorium Git, usuniesz go z repozytorium, wykonując następujące czynności:
git tag -d release01
git push origin :refs/tags/release01
Aby usunąć jeden z repozytorium Mercurial:
hg tag --remove featurefoo
Proszę odnieść się do https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
Jeśli używasz programu PowerShell i chcesz usunąć kilka z nich:
# Local tags:
git tag -l | foreach { git tag -d $_ }
# Remote tags:
git tag -l | foreach { git push --delete origin $_ }
Oczywiście możesz je również przefiltrować przed usunięciem:
git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
Zgodnie z sugestią @CubanX, podzieliłem tę odpowiedź z mojego oryginału:
xargs
i może skalować się znacznie bardziej z poprawkami. Korzysta z Github API , osobistego tokena dostępu i wykorzystuje narzędzie parallel
.git tag | sorting_processing_etc | parallel --jobs 2 curl -i -X DELETE \
https://api.github.com/repos/My_Account/my_repo/git/refs/tags/{} -H
\"authorization: token GIT_OAUTH_OR_PERSONAL_KEY_HERE\" \
-H \"cache-control: no-cache\"`
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
i git tag -d
, co jest wystarczające.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
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.
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ń
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin
Usuń wszystkie lokalne tagi i wyklucz wyrażenie z Usuń
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
Prosty skrypt do usunięcia podanego tagu z lokalizacji lokalnej i źródłowej. Sprawdzanie, czy tag naprawdę istnieje.
if [ $(git tag -l "$1") ]; then
git tag --delete $1
git push --delete origin $1
echo done.
else
echo tag named "$1" was not found
fi
Jak używać:
$> git-tag-purge.sh nazwa_znacznika)
Wydaje się, że dużo pracy nad czymś, co xargs
już robi. Patrząc wstecz na ten wątek, domyślam się, że powolność, z xargs
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ń:
git tag | sorting_processing_etc | xargs git push --delete origin
xargs
potrafi również uruchamiać procesy równolegle. Metoda 2 z xargs
:
git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin
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.
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 znaczy
git tag -d #STOO2
Nie usunie znacznika, ale zawinie go w literały łańcuchowe w ten sposób
git tag -d "#ST002" or git tag -d '#ST002'
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.
Oto lokalna skrzynka testowa do testowania lokalnego bez bałagania za pomocą pilota:
~/p $ mkdir gittest
~/p/git $ cd gittest/
~/p/gittest $ git init
Initialized empty Git repository in /Users/local_user/p/gittest/.git/
~/p/gittest $ touch testfile.txt
~/p/gittest $ git add testfile.txt
~/p/gittest $ git commit -m "initial commit"
[master (root-commit) 912ce0e] initial commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 testfile.txt
~/p/gittest $ git tag
~/p/gittest $ git tag -a testtag
~/p/gittest $ git tag
testtag
~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
~/p/gittest $ cd ..
~/p $ mkdir gitbare
~/p $ cd gitbare
~/p/gitbare $ git init --bare
Initialized empty Git repository in /Users/local_user/p/gitbare/
~/p/gitbare $ cd ..
~/p $ cd gittest/
~/p/gittest $ git remote add origin /Users/local_user/p/gitbare
~/p/gittest $ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
~/p/gittest $ git push origin testtag
Counting objects: 1, done.
Writing objects: 100% (1/1), 163 bytes | 163.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
* [new tag] testtag -> testtag
~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
~/p/gittest $ git push -d origin testtag
To /Users/local_user/p/gitbare
- [deleted] testtag
~/p/gittest git tag -d testtag
Deleted tag 'testtag' (was b0a6c15)
~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
~/p/gittest
Cześć, chciałem tylko udostępnić utworzony alias, który robi to samo:
Dodaj następujące elementy do ~ / .gitconfig
[alias]
delete-tag = "!f() { \
echo 'deleting tag' $1 'from remote/origin ausing command: git push --delete origin tagName;'; \
git push --delete origin $1; \
echo 'deleting tag' $1 'from local using command: git tag -d tagName;'; \
git tag -d $1; \
}; f"
Użycie wygląda następująco:
-->git delete-tag v1.0-DeleteMe
deleting tag v1.0-DeleteMe from remote/origin ausing command: git push --delete origin tagName;
To https://github.com/jsticha/pafs
- [deleted] v1.0-DeleteMe
deleting tag v1.0-DeleteMe from local using command: git tag -d tagName;
Deleted tag 'v1.0-DeleteMe' (was 300d3ef22)