Daha önce aktarılmış bir Git etiketini nasıl silebilirsiniz?
Daha önce aktarılmış bir Git etiketini nasıl silebilirsiniz?
Yanıtlar:
Uzak etiket adına "boş" bir referans göndermeniz yeterlidir:
git push origin :tagname
Ya da, daha açık bir şekilde, --delete
seçeneği kullanın (veya -d
git 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
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.
git push --delete origin tag1 tag2
. Aynı şey yerel etiketlerin silinmesi için de geçerlidirgit tag -d tag1 tag2
tag
yalnızca tek bir taahhüde bağlıdır. Bu nedenle şube adı önemsizdir.
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.
Daha basit bir yol
git push --delete origin YOUR_TAG_NAME
IMO önekini yapan kolon sözdizimi bu durumda biraz tuhaf
git push --delete origin "TAGNAME"
TAGNAME orijinal etiketin adıdır.
tag
varsa, şubeyi değil etiketi aldığınızdan emin olmak için etiketi etiket adınızın önüne koyabilirsiniz .
refs/tags/
bu gibi: refs/tags/v2.3.1
.
v0.1.0
Silinecek bir uzak etiketiniz varsa ve uzaktan kumandanız varsa, origin
basitç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 :
.
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...?
:tagname
uzaktan silme için çalışmalıdır.
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
Etiketi uzak depodan kaldırmak için:
git push --delete origin TAGNAME
Etiketi yerel olarak da silmek isteyebilirsiniz:
git tag -d TAGNAME
git push --delete origin TAGNAME && git tag -d TAGNAME
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.
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
your_tag_name
gelen yerel repo.your_tag_name
gelen uzaktan repo.git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
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>'
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 tag
veya ile başlayın git ls-remote --tags
. Aşağıdaki örneklerde sorting_proccessing_etc
, istediğiniz herhangi bir grep
ing, sort
ing, tail
ing veya head
ing ( örneğin, grep -P "my_regex" | sort | head -n -200
vb. ) Atlayabilir veya değiştirebilirsiniz :
xargs
az 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 push
Bu 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
).
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 xargs
ve git tag -d
bu 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 " ")
SourceTree - harika bir Git GUI - kullanıyorsanız, bunu komut satırı olmadan aşağıdakileri yaparak kolayca yapabilirsiniz:
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.
release01
Git deposunda adlı bir etiket oluşturduysanız , aşağıdakileri yaparak onu deponuzdan kaldırabilirsiniz:
git tag -d release01
git push origin :refs/tags/release01
Mercurial deposundan bir tanesini kaldırmak için:
hg tag --remove featurefoo
Lütfen https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
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 $_ }
@CubanX'in önerdiği gibi, bu cevabı orijinalimden ayırdım:
xargs
tweaking 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\"`
parallel
birç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 2
hı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 xargs
ve git tag -d
bu da yeterlidir.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
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.
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
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:
$> git-tag-purge.sh etiket_adı)
xargs
Zaten bir şey için çok iş gibi görünüyor . Bu konuya baktığımda, xargs
deneyimlediğiniz yavaşlığı tahmin ediyorum , çünkü xargs -n 1
gerçekten ihtiyaç duymadığında kullanılan orijinal cevap .
Bu, xargs
otomatik 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
xargs
sü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.
# 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 .
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
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)