Git deposundaki tüm etiketleri silme


224

Git deposundaki tüm etiketleri silmek istiyorum. Bunu nasıl yapabilirim?

Kullanarak git tag -d tagnameetiketi tagnameyerel olarak silin ve git push --tagsben kullanarak git sağlayıcıdaki etiketleri güncelleyin.

Denedim:

git tag -d *

Ama *bunun geçerli dizindeki dosyalar anlamına geldiğini görüyorum .

$ git tag -d *
error: tag 'file1' not found.
error: tag 'file2' not found.
...

Çok fazla etiketim olduğunu ve hepsini silmek istiyorum.

Yanıtlar:


419
git tag | xargs git tag -d

Her şeyi birbirine bağladığınız Linux felsefesini kullanmanız yeterlidir. Windows'ta aynı komutla git bash kullanın.


136
Teşekkürler. Bu komut yerel etiketleri siler. Kullandığım git tag -l | xargs -n 1 git push --delete originuzaktan silmeniz.
Ionică Bizău

7
Peki ya Windows?
CodeManX

7
@CoDEmanX Windows'ta git bash'ı aynı komutla kullanmalısınız.
inf3rno

2
Uzak etiketleri silmez, binlerce etiket için de çok yavaştır.
Adrian Baker

1
'xargs' Windows 10'da dahili veya harici bir komut olarak tanınmıyor
Gulzar

207

Uzak etiketleri silmek için (yerel etiketleri silmeden önce) yapmanız gerekenler:

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

ve ardından yerel kopyaları silin:

git tag | xargs git tag -d

Uzaktan silme onlarca etiket için çok yavaş.
ffxsam

5
Çok fazla uzak etiketiniz varsa bu yanıt çok daha hızlıdır: stackoverflow.com/a/34395864/747044
adriaan

Bu yanıttaki komutların sırası, yalnızca yerel etiketlerin olmadığını varsayar.
Acumenus

Bu çok yavaş, aşağıdaki çözüm daha iyi.
Root Fool

Taahhütler için parola girmeniz gerekiyorsa, bu her etiket için parola gerektirir. Diğer çözüm daha iyidir.
kap

56

Tüm etiketleri tek bir komutta silmek için daha verimli olabilir. Özellikle birkaç yüzünüz varsa.

Uygun bir Windows olmayan kabukta, tüm uzak etiketleri silin:

git tag | xargs -L 1 | xargs git push origin --delete

Ardından tüm yerel etiketleri silin:

git tag | xargs -L 1 | xargs git tag --delete

'Etiket adlarınızda bir tane olmadığı sürece bu iyi olmalıdır . Bunun için aşağıdaki komutlar iyi olmalıdır.

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

Bir satır listesi almanın, bunları tırnak içine almanın, tek bir satır haline getirmenin ve daha sonra bu satırı bir komuta iletmenin diğer yolları muhtemelen vardır. Bunu göz önünde bulundurarak nihai kedi derisi ortamı ve hepsi.


3
Birkaç bin etiketim vardı, uzak bir bulut deposundan tek tek silmek günler alıyordu, bu da çözüldü.
Adrian Baker

Ne yapar xargs -L 1?
ymett

-L max-satır --max-satır [= max-satır] -l [max-satır] Komut satırı başına en fazla maksimum satır boş olmayan giriş satırı kullanın. '-L' için, maksimum satırlar atlanırsa varsayılan olarak 1 olur. '-L' için argüman zorunludur. Sondaki boşluklar, satırları saymak amacıyla bir girdi satırının bir sonraki girdi satırında mantıksal olarak devam etmesine neden olur. '-X' anlamına gelir. Bu seçeneğin '-l' formu POSIX uyumlu '-L' seçeneği lehine kullanımdan kaldırılmıştır. gnu.org/software/findutils/manual/html_node/find_html/…
Richard A Quadling

@RichardAQuadling Tamam, ama bunun cevabında ne gibi bir etkisi var? git tagetiketleri her satıra bir tane gelecek şekilde döndürür ve her satıra xargs -L 1bir tane verir, bu ne işe yarar?
ymett

Hmmm. Görünüşe göre bu bağlamda hiçbir şey! İşleri daha yavaş bir dokunuş yapmak dışında!
Richard A Quadling

24

PowerShell kullanan Windows kullanıcıları için:

git tag | foreach-object -process { git tag -d $_ }

Bu, döndürülen her satır için git tagyürütülerek döndürülen tüm etiketleri siler git tag -d.


23

Etiketin uzaktan nasıl silineceğini eksik olan Stefan'ın cevabına ekleme. Windows powershell için, önce yerel etiketleri izleyen uzak etiketleri silmek için bunu çalıştırabilirsiniz.

git tag | foreach-object -process { git push origin --delete $_ }
git tag | foreach-object -process { git tag -d $_ }  

19

Yerel deponuzda etiket yoksa, uzak etiketleri yerel deponuza götürmek zorunda kalmadan silebilirsiniz.

git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete

Uzak kaynak isminizle "orijin" yerine geçmeyi unutmayın.


Mükemmel! Bu hepsini bir kerede sildi. Diğer komut her 2 saniyede bir siliniyordu
fregante


6

Ayrıca kullanabilirsiniz:

git tag -d $(git tag)

binlerce gibi çok fazla etiketiniz varsa bu işe yaramaz
DixonD

bu durumda şöyle bir şey kullanabilirsiniz: git tag -d $ (git tag | head -n 999) ve x kez yürütebilirsiniz
ViZeke

1

Tüm bu seçenekler sadece Linux'ta çalıştığından, işte bununla uğraşmak zorunda kalan herkes için eşdeğer pencereler:

FOR /F usebackq %t IN (`git tag`) DO @git tag --delete %t

1

Etiketleri önek ile silmem gerekiyor

örneğin, v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5 etiketlerini silmek zorundayım

git tag -d $(git tag -l "v0.0.*")

Yukarıdaki ifadeyi ayrıştırın ve açıklayın:

  1. Öneki olan tüm etiketleri listelemek için

    git tag -l "v0.0. *"

  2. Etiketleri silmek için

    git tag -d $ tag_names Bu deyim şöyle çalışır


Hızlı, basit ve etkili. Çalıştım, teşekkürler!
Vedran Mandić

0

Powershell v7, silmeniz gereken çok sayıda yukarı akış (orijin) etiketiniz varsa paralel foreach'u destekler:

git tag | foreach-object -Parallel { 
git push origin --delete $_ 
git tag -d $_ 
}
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.