Bir uzak etiket nasıl silinir?


3420

Daha önce aktarılmış bir Git etiketini nasıl silebilirsiniz?

Yanıtlar:


5753

Uzak etiket adına "boş" bir referans göndermeniz yeterlidir:

git push origin :tagname

Ya da, daha açık bir şekilde, --deleteseçeneği kullanın (veya -dgit sürümünüz 1.8.0'dan eskiyse):

git push --delete origin tagname

Git öğesinin etiket ad alanı ve şube ad alanı olduğunu unutmayın, böylece şube ve etiket için aynı adı kullanabilirsiniz. Etiket yerine dalı yanlışlıkla kaldıramayacağınızdan emin olmak istiyorsanız, bir dalı asla silmeyecek olan tam ref belirtebilirsiniz:

git push origin :refs/tags/tagname

Yerel etiketi de silmeniz gerekiyorsa, şunu kullanın:

git tag --delete tagname

Arka fon

Bir şubeyi, etiketi veya başka bir referansı uzak bir depoya göndermek, "hangi repo, hangi kaynak, hangi hedef?"

git push remote-repo source-ref:destination-ref

Ana dalınızı kaynağın ana dalına ittiğiniz gerçek bir dünya örneği:

git push origin refs/heads/master:refs/heads/master

Hangi varsayılan yollar nedeniyle, kısaltılabilir:

git push origin master:master

Etiketler aynı şekilde çalışır:

git push origin refs/tags/release-1.0:refs/tags/release-1.0

Hangi ayrıca kısaltılabilir:

git push origin release-1.0:release-1.0

Kaynak ref'yi (iki nokta üstünden önceki kısım) atlayarak, uzaktaki ref'yi silerek hedefe 'hiçbir şey' basmazsınız.


187
Hem soruyu cevaplamak hem de genel vakayı açıklamak ve kısaltılmamış sözdiziminin anlamını detaylandırmak için +1
Peter Host

77
Ve birisinin aynı anda birden fazla etiketi nasıl sileceğini merak etmesi durumunda, beyaz alanı kullanarak basit bir şekilde listeleyebilirsiniz, örn git push --delete origin tag1 tag2. Aynı şey yerel etiketlerin silinmesi için de geçerlidirgit tag -d tag1 tag2
dVaffection

8
Etiket adı bir dal adıyla çakışıyorsa, son olarak dalınızı silebilirsiniz. Ha-ha. İkinci cevaba bakın - daha ekolojik
Zuba

1
@EmmaHe A tagyalnızca tek bir taahhüde bağlıdır. Bu nedenle şube adı önemsizdir.
cb2

1
git tag -d `git tag`Tüm yerel etiketleri sileceğini bilmek de ilginçtir . Aynı durum git push --delete origin `git tag`, uzak etiketleri yerel olarak çektiğinizi varsayar. Bu test ortamında kullanışlıdır.
DarkFranX

382

Daha basit bir yol

git push --delete origin YOUR_TAG_NAME

IMO önekini yapan kolon sözdizimi bu durumda biraz tuhaf


4
Bence bu doğru bir yol ... diğer sözdizimi daha çok bana hack gibi görünüyor.
Luigi R. Viggiano

11
Evet, bu basit ve işe yarıyor. Değişken bölümün ne olduğunu belirterek cevabı açıklığa kavuşturabilmeme rağmen: git push --delete origin "TAGNAME"TAGNAME orijinal etiketin adıdır.
Teemu Leisti

12
Bu çalışıyor. Bir ek: Aynı adla bir şubeniz ve bir etiketiniz tagvarsa, şubeyi değil etiketi aldığınızdan emin olmak için etiketi etiket adınızın önüne koyabilirsiniz .
andypaxo

9
@andypaxo Ne komut alır doğru yolu etiketleri önek olacağını, refspecs olan refs/tags/bu gibi: refs/tags/v2.3.1.
Mayıs

Uzak sunucuda özel karakterler içeren bir şekilde 'kötü' etiket adı oluşturdum, bu yüzden senkronizasyon yapamıyorum, bu yüzden önerinizle bunu kaldırdım: git push --delete origin "service-- <default> - 151 ", intellij ile değil, stash ile değil, sourceTree ile değil. Teşekkürler !
Dmitri Algazin

215

v0.1.0Silinecek bir uzak etiketiniz varsa ve uzaktan kumandanız varsa, originbasitçe:

git push origin :refs/tags/v0.1.0

Etiketi yerel olarak da silmeniz gerekiyorsa:

git tag -d v0.1.0

Git'in silinme söz diziminin açıklaması için Adam Franco'nun cevabına bakınız :.


2
bu jgit ile de çalışır. the: shorthand jgit ile çalışmaz
rynop

Anladım fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1...?
Chaim Eliyah

3
@ChaimEliyah önde gelen bir eğik çizginiz var, belki de bu sizin probleminiz
Joffrey

5
Daha iyi cevap, çünkü aynı şekilde bir şube ve bir etiketiniz varsa da çalışır.
Erik A. Brandstadmoen

Sadece :tagnameuzaktan silme için çalışmalıdır.
Acumenus

106

Tüm yerel etiketleri silin ve uzak etiketlerin listesini alın :

git tag -l | xargs git tag -d
git fetch

Tüm uzak etiketleri kaldır

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

Yerel etiketleri temizleme

git tag -l | xargs git tag -d

2
Yerel ve uzak depolardaki tüm etiketler nasıl kaldırılır. Aradığım şey bu, teşekkürler!
Jorge Orpinel

git getir, uzaktan silme ve sonra yerlileri temizle, güzel çalıştı!
DiegoRBaquero

yavaş, ama en basit
Lucent Fox

33

Etiketi uzak depodan kaldırmak için:

git push --delete origin TAGNAME

Etiketi yerel olarak da silmek isteyebilirsiniz:

git tag -d TAGNAME

her ikisini de yapmak için bir satır:git push --delete origin TAGNAME && git tag -d TAGNAME
sakurashinken

25

Terminalinizden şunu yapın:

git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}

Şimdi Github.com'a gidin ve yenileyin, kaybolurlar.


3
git etiketi değil etiketleri
DSF

23
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
  1. İlk satır siler your_tag_namegelen yerel repo.
  2. İkinci satır, siler your_tag_namegelen uzaktan repo.
  3. GitHub Bültenleri bölümünüzdeki Taslağı sil düğmesine basın .

resim açıklamasını buraya girin


2
Bu komut soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini artırır. Nasıl Cevap
Popo

20

Yerel etiketi '12345' sil

git tag -d 12345

'12345' uzak etiketini silin (örneğin; GitHub sürümü de)

git push origin :refs/tags/12345

Alternatif yaklaşım

git push --delete origin tagName
git tag -d tagName

resim açıklamasını buraya girin


15

Uzak etiket olarak adlandırılmış bir uzak dalınız varsa, bu komutların belirsiz olduğunu unutmayın:

git push origin :tagname
git push --delete origin tagname

Bu yüzden etiketi silmek için bu komutu kullanmalısınız:

git push origin :refs/tags/<tag>

ve şubeyi silmek için:

git push origin :refs/heads/<branch>

Değilse, böyle bir hata alırsınız:

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'

Kısa ve özlü. Bu yazı MeganZhou ile birlikte neden sorun yaşadığımızın cevabı, şube adı ve tagname özdeşti. Yerel etiketi sildim ve ittim: refs / tags ve hepsi iyiydi.
rwheadon

12

Binlerce uzak etiket için 100 kata kadar daha hızlı yöntem

Bu yanıtları 11.000'den fazla etiketi silmeye ihtiyaç duyduktan sonra okuduktan sonra xargs, yazmak için saatleriniz olmadıkça bu yöntemlerin güvenilir olduğunu veya çok uzun sürdüğünü öğrendim .

Mücadele ederken, çok daha hızlı iki yol buldum . Her ikisi için de, uzaktan kumandadan silmek istediğiniz etiketlerin listesini yapmak için git tagveya ile başlayın git ls-remote --tags. Aşağıdaki örneklerde sorting_proccessing_etc, istediğiniz herhangi bir greping, sorting, tailing veya heading ( örneğin, grep -P "my_regex" | sort | head -n -200 vb. ) Atlayabilir veya değiştirebilirsiniz :


Bu ilk yöntem en hızlısıdır, belki de kullanmaktan 20 ila 100 kat daha hızlıdır ve bir seferde en xargsaz birkaç bin etiketle çalışır .

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh

Bu nasıl çalışıyor? Normal, satırla ayrılmış etiket listesi, her biri bununla başlayarak, boşlukla ayrılmış tek bir etiket satırına dönüştürülür :. . .

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

git pushBu biçim etiketi ile kullanmak , her uzaktan referansa hiçbir şey basmaz, onu siler (bu şekilde normal şekilde itme biçimi local_ref_path:remote_ref_path).

İkinci yöntem , bu sayfanın başka bir yerinde ayrı bir yanıt olarak ayrılmıştır


Bu yöntemlerin her ikisinden sonra, muhtemelen yerel etiketlerinizi de silmek istersiniz. Bu çok daha hızlıdır, bu yüzden kullanmaya geri dönebiliriz xargsve git tag -dbu da yeterlidir.

git tag | sorting_processing_etc | xargs -L 1 git tag -d

VEYA uzaktan silme işlemine benzer:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")

Bunu birkaç farklı cevaba ayırmalısınız. Bir satırda birden fazla etiket bulunan yanıt, şüphesiz, toplu etiket silme için doğru cevaptır. Bu bilgiyi hemen hemen her yerde bulmak biraz zor. Ne aradığımı bile bilmiyorum, git yardım sayfasında bulmakta zorlanıyorum :) Size kudos ve doğru cevap olarak vurgulayın ve GitHub API'sını farklı bir yere taşıyın. Ve son olarak, silme etiketleri yerel olarak, toplu olarak, alanla sınırlandırılmış etiketlerle (kolonlardan kurtulun) çalışır
CubanX

Övgü ve öneriler için teşekkürler. Bunu böleceğim. Yerel etiket silme hakkındaki yorumunuzu anlamıyorum. Son komut snippet'imin iki nokta üst üste işareti kullandığını düşünmüyorum, ancak mobil cihazdayım, bu yüzden belki bir şey eksik.
TonyH

Maalesef, uzak etiketleri silmek için yaptığınız şeyin, yerel etiketleri silmekle birlikte çalışarak tüm listeyi bir kerede sağlaması gerektiğini kastediyorum. :) Sadece git push origin yerine: tag1: tag2 vb. Git tag --delete tag1 tag2 tag3 bu şekilde toplam temizlik yapabilirsiniz. Tekrar, bir ton teşekkürler!
CubanX

11

SourceTree - harika bir Git GUI - kullanıyorsanız, bunu komut satırı olmadan aşağıdakileri yaparak kolayca yapabilirsiniz:

  1. Deponuzu SourceTree'de açın
  2. Soldaki "Etiketler" sekmesini seçin ve genişletin
  3. Silmek istediğiniz etiketi sağ tıklayın
  4. "YOUR_TAG_NAME Sil" i seçin
  5. Doğrulama penceresinde "Etiketi Uzaktan Kumandalardan Kaldır" ı seçin

YOUR_TAG_NAME, artık GitHub, BitBucket veya bu depo için uzaktan kumanda olarak listelediğiniz herhangi bir yerde yerel deponuzdan ve tüm uzaktan kumandalarınızdan kaldırılacak.

Ayrıca, bir etiketi yerel olarak sildiyseniz, ancak uzak kaynaklarda değil ve her yerde silmek istiyorsanız, yalnızca aynı ada sahip ve kaynaklarla aynı işlemde eklenmiş yeni bir etiket oluşturun. Ardından, her yeri silmek için yukarıdaki adımları tekrarlayın.


Tıkır tıkır çalışıyor. Teşekkürler!
Native_Mobile_Arch_Dev


7

PowerShell kullanıyorsanız ve bir demetini silmek istiyorsanız:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

Elbette, silmeden önce bunları da filtreleyebilirsiniz:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }

Bu düzgün ve iyi bir normal ifade örneğiydi. Teşekkürler iyi efendim
Yunus

7

@CubanX'in önerdiği gibi, bu cevabı orijinalimden ayırdım:

İşte xargstweaking ile birkaç kat daha hızlı ve çok daha ölçeklendirilebilir bir yöntem . Kişisel bir erişim belirteci olan Github API'sını kullanır ve yardımcı programı kullanır 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\"`

parallelbirçok çalışma moduna sahiptir, ancak genellikle işlem sayısı üzerinde sınırlar belirlemenize izin verirken, verdiğiniz herhangi bir komutu paralel hale getirir. Daha --jobs 2hızlı çalışmaya izin vermek için parametreyi değiştirebilirsiniz , ancak şu anda 5000 / saat olan Github'un hız limitleriyle ilgili problemlerim vardı , ancak belgesiz kısa vadeli bir limite de sahip gibi görünüyor.


Bundan sonra, muhtemelen yerel etiketlerinizi de silmek istersiniz. Bu çok daha hızlıdır, bu yüzden kullanmaya geri dönebiliriz xargsve git tag -dbu da yeterlidir.

git tag | sorting_processing_etc | xargs -L 1 git tag -d

Bu, kabul edilen cevaptan çok daha karmaşık görünüyor. Avantajı nedir?
theUtherSide

2
Birkaç bin etiketi silmeniz gerekiyorsa, hız 10-100 kat daha hızlıdır
TonyH

Açıklama için teşekkür ederim. OP tek bir etiketi silmek istedi. Birinin neden bu yaklaşımı tek bir etiket için kullanacağını hayal edemiyorum. Belki de bu cevap, birçok etiketin silinmesini içeren başka bir soru için daha iyidir
TheUtherSide

Var olduğunu düşünmüyorum. Kendime cevap vermek için yaratabilirim. Bunun uygun olduğunu düşünmek ister misiniz?
TonyH

1
Yaparım! Aslında burada oldukça yaygın bir uygulama olduğunu düşünüyorum.
theUtherSide

6

Diğer cevaplar bunun nasıl yapılacağına işaret ediyor, ancak bunun uzak bir depo olduğu için sonuçları aklınızda bulundurmalısınız.

Yeniden Etiketleme bölümünde git etiketi kılavuz sayfası, uzak repo'nun diğer kullanıcılarına bu değişiklik hakkında nazikçe nasıl bilgi verileceği konusunda iyi bir açıklamaya sahiptir. Hatta başkalarının değişikliklerinizi nasıl alması gerektiğini bildirmek için kullanışlı bir duyuru şablonu verir.


6

Son birkaç aydaki üretim etiketlerinin tümünü silebilmek için bir modelle eşleşenler dışındaki tüm etiketleri kaldırmak istedim, işte büyük başarıya alıştığım şey:

Tüm Uzak Etiketleri Sil ve İfadeyi Silin Hariç Tut

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

Tüm Yerel Etiketleri Sil ve İfadeyi Silin Hariç Tut

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d

5

Hem yerel hem de menşe konumlarından verilen etiketi kaldırmak için basit komut dosyası. Etiketin gerçekten var olup olmadığını kontrol edin.

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

Nasıl kullanılır:

  • Kabuk komut dosyası oluşturun (örn. Git-tag-purge.sh) ve içeriği yapıştırın.
  • chmod dosyasını çalıştırılabilir hale getirmek için.
  • Komut dosyasını global olarak kullanılabilir yap
  • git projenize cd
  • Çağrı komut dosyası (ör.
    $> git-tag-purge.sh etiket_adı
    )

4

xargsZaten bir şey için çok iş gibi görünüyor . Bu konuya baktığımda, xargsdeneyimlediğiniz yavaşlığı tahmin ediyorum , çünkü xargs -n 1gerçekten ihtiyaç duymadığında kullanılan orijinal cevap .

Bu, xargsotomatik olarak maksimum komut satırı uzunluğuyla ilgilenmesi dışında yönteminize eşdeğerdir :

git tag | sorting_processing_etc | xargs git push --delete origin

xargssüreçleri paralel olarak da çalıştırabilir. Yöntem 2 xargs:

git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin

Yukarıda her işlemde en fazla 100 bağımsız değişkeni işlemek için en fazla 5 işlem kullanılır. İhtiyaçlarınız için en uygun olanı bulmak için argümanları deneyebilirsiniz.


İlginç. Her gün bir Unix komutu hakkında yeni bir şeyler öğreniyorsunuz. Kullanım durumumu bu alternatifle test etmem gerekecek.
TonyH

4

# Karakterinden başlayarak oluşturulmuş bir etiketiniz varsa , örneğin #ST002, normal kalıpları kullanarak u silemeyeceğinizi görebilirsiniz. yani

git tag -d #STOO2

Etiketi silmek, ancak bir sararak olmaz Dize da Değişmez şöyle

git tag -d "#ST002" or git tag -d '#ST002'

Bu silinir. Bunu ummak, etiket adlarını yazmak için # kullanma hatası yapan birine yardımcı olacaktır .


2

Uzaktan kumandayla uğraşmadan yerel olarak test etmek için yerel bir test çantası:

~/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

1

Merhaba, ben aynı şeyi yapan bir takma ad paylaşmak istedim:

Aşağıdakileri ~ / .gitconfig dosyanıza ekleyin

[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"

Kullanım şöyle görünür:

-->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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.