Bagaimana Anda menghapus tag Git yang sudah didorong?
Anda hanya perlu mendorong referensi 'kosong' ke nama tag jarak jauh:
git push origin :tagname
Atau, lebih ekspresif, gunakan --delete
opsi (atau -d
jika versi git Anda lebih dari 1.8.0):
git push --delete origin tagname
Perhatikan bahwa git memiliki namespace tag dan namespace cabang sehingga Anda dapat menggunakan nama yang sama untuk cabang dan tag. Jika Anda ingin memastikan bahwa Anda tidak dapat secara tidak sengaja menghapus cabang alih-alih tag, Anda dapat menentukan referensi lengkap yang tidak akan pernah menghapus cabang:
git push origin :refs/tags/tagname
Jika Anda juga perlu menghapus tag lokal, gunakan:
git tag --delete tagname
Mendorong cabang, tag, atau referensi lain ke repositori jarak jauh melibatkan menentukan "repo mana, sumber apa, tujuan apa?"
git push remote-repo source-ref:destination-ref
Contoh dunia nyata di mana Anda mendorong cabang master Anda ke cabang master asal adalah:
git push origin refs/heads/master:refs/heads/master
Yang karena jalur default, dapat disingkat menjadi:
git push origin master:master
Tag bekerja dengan cara yang sama:
git push origin refs/tags/release-1.0:refs/tags/release-1.0
Yang juga dapat disingkat menjadi:
git push origin release-1.0:release-1.0
Dengan menghilangkan referensi sumber (bagian sebelum titik dua), Anda mendorong 'tidak ada' ke tujuan, menghapus referensi pada ujung jarak jauh.
git push --delete origin tag1 tag2
. Hal yang sama berlaku untuk penghapusan tag lokalgit tag -d tag1 tag2
tag
hanya melekat pada satu komit. Karena itu nama cabang tidak relevan.git tag -d `git tag`
akan menghapus semua tag lokal. Hal yang sama berlaku untukgit push --delete origin `git tag`
asumsi Anda menarik tag jarak jauh secara lokal. Itu berguna dalam lingkungan pengujian.Cara yang lebih mudah adalah
Sintaksis titik awal IMO agak aneh dalam situasi ini
sumber
git push --delete origin "TAGNAME"
:, di mana TAGNAME adalah nama dari tag asli.tag
depan nama tag Anda untuk memastikan Anda mendapatkan tag, bukan cabang.refs/tags/
, seperti ini:refs/tags/v2.3.1
.Jika Anda memiliki tag jarak jauh
v0.1.0
untuk dihapus, dan jarak jauh Anda adalahorigin
, maka cukup:Jika Anda juga perlu menghapus tag secara lokal:
Lihat jawaban Adam Franco untuk penjelasan tentang
:
sintaksis Git yang tidak biasa untuk dihapus.sumber
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...?:tagname
harus bekerja untuk penghapusan jarak jauh.Hapus semua tag lokal dan dapatkan daftar tag jarak jauh :
Hapus semua tag jarak jauh
Bersihkan tag lokal
sumber
Untuk menghapus tag dari repositori jarak jauh:
Anda mungkin juga ingin menghapus tag secara lokal:
sumber
git push --delete origin TAGNAME && git tag -d TAGNAME
Dari terminal Anda, lakukan ini:
Sekarang pergi ke Github.com dan menyegarkan, mereka menghilang.
sumber
your_tag_name
dari repo lokal .your_tag_name
dari repo jarak jauh .sumber
Hapus tag lokal '12345'
Hapus tag jarak jauh '12345' (misalnya; versi GitHub juga)
pendekatan alternatif
sumber
Perhatikan saja, jika Anda memiliki cabang jarak jauh yang dinamai tag jarak jauh, perintah-perintah ini ambigu:
Jadi, Anda harus menggunakan perintah ini untuk menghapus tag:
dan yang ini untuk menghapus cabang:
Jika tidak, Anda akan mendapatkan kesalahan seperti ini:
sumber
Metode hingga 100x lebih cepat untuk ribuan tag jarak jauh
Setelah membaca jawaban-jawaban ini sambil perlu menghapus lebih dari 11.000 tag, saya mempelajari metode-metode ini dengan mengandalkan atau
xargs
memakan waktu terlalu lama, kecuali Anda punya waktu untuk membakar.Berjuang, saya menemukan dua cara yang jauh lebih cepat. Untuk keduanya, mulai dengan
git tag
ataugit ls-remote --tags
untuk membuat daftar tag yang ingin Anda hapus pada remote. Dalam contoh di bawah ini Anda dapat menghilangkan atau menggantisorting_proccessing_etc
dengangrep
ing,sort
ing,tail
ing atauhead
ing yang Anda inginkan ( misalnyagrep -P "my_regex" | sort | head -n -200
dll ):Metode pertama ini adalah yang tercepat, mungkin 20 hingga 100 kali lebih cepat daripada menggunakan
xargs
, dan bekerja dengan setidaknya beberapa ribu tag sekaligus.Bagaimana cara kerjanya? Daftar tag yang dipisahkan secara normal baris dikonversi ke satu baris dari tag yang dipisahkan oleh spasi, masing-masing diawali dengan
:
demikian. . .Penggunaan
git push
dengan tag format ini tidak mendorong apa pun ke setiap ref jarak jauh, menghapusnya (format normal untuk mendorong cara ini adalahlocal_ref_path:remote_ref_path
).Metode dua dipecah sebagai jawaban terpisah di tempat lain pada halaman yang sama
Setelah kedua metode ini, Anda mungkin juga ingin menghapus tag lokal Anda. Ini jauh lebih cepat sehingga kita dapat kembali menggunakan
xargs
dangit tag -d
, mana sudah cukup.ATAU mirip dengan penghapusan jarak jauh:
sumber
Jika Anda menggunakan SourceTree - GUI Git yang hebat - maka Anda dapat dengan mudah melakukan ini tanpa baris perintah dengan melakukan hal berikut:
YOUR_TAG_NAME sekarang akan dihapus dari repositori lokal Anda dan semua remote - baik itu GitHub, BitBucket, atau di mana pun Anda terdaftar sebagai remote untuk repositori itu.
Juga, jika Anda menghapus tag secara lokal tetapi tidak pada asal yang jauh, dan Anda ingin menghapusnya di mana-mana, maka buat saja tag baru yang memiliki nama yang sama dan dilampirkan pada komit yang sama seperti asal. Kemudian, ulangi langkah-langkah di atas untuk menghapus di mana-mana.
sumber
Jika Anda telah membuat tag yang disebut
release01
dalam repositori Git Anda akan menghapusnya dari repositori Anda dengan melakukan hal berikut:Untuk menghapus satu dari repositori Mercurial:
Harap referensi https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
sumber
Jika Anda menggunakan PowerShell, dan Anda ingin menghapus banyak dari mereka:
Tentu saja, Anda juga dapat memfilternya sebelum menghapus:
sumber
Seperti yang disarankan oleh @CubanX, saya membagi jawaban ini dari yang asli:
Berikut adalah metode yang beberapa kali lebih cepat daripada
xargs
dan mungkin lebih berskala dengan tweaking. Ia menggunakan Github API , token akses pribadi, dan memanfaatkan utilitasparallel
.parallel
memiliki banyak mode operasi, tetapi umumnya memparalelkan perintah yang Anda berikan sambil memungkinkan Anda untuk menetapkan batas pada jumlah proses. Anda dapat mengubah--jobs 2
parameter untuk memungkinkan operasi lebih cepat, tapi saya punya masalah dengan batas laju Github , yang saat ini 5000 / jam, tetapi juga tampaknya memiliki batas jangka pendek tidak berdokumen juga.Setelah ini, Anda mungkin juga ingin menghapus tag lokal Anda. Ini jauh lebih cepat sehingga kita dapat kembali menggunakan
xargs
dangit tag -d
, mana sudah cukup.sumber
Jawaban lain menunjukkan bagaimana menyelesaikan ini, tetapi Anda harus mengingat konsekuensinya karena ini adalah repositori jarak jauh.
Halaman manual tag git, di bagian On Retagging , memiliki penjelasan yang baik tentang bagaimana cara dengan sopan memberi tahu pengguna repo lain tentang perubahan tersebut. Mereka bahkan memberikan template pengumuman yang berguna untuk mengomunikasikan bagaimana orang lain harus mendapatkan perubahan Anda.
sumber
Saya ingin menghapus semua tag kecuali yang cocok dengan pola sehingga saya bisa menghapus semua kecuali beberapa bulan tag produksi, inilah yang saya gunakan untuk sukses besar:
Hapus Semua Tag Jarak Jauh & Kecualikan Ekspresi Dari Hapus
Hapus Semua Tag Lokal & Kecualikan Ekspresi Dari Hapus
sumber
Skrip sederhana untuk menghapus tag yang diberikan dari lokasi lokal dan asal. Dengan tanda centang apakah tag benar-benar ada.
Cara Penggunaan:
sumber
Sepertinya banyak pekerjaan untuk sesuatu
xargs
sudah dilakukan. Melihat ke belakang melalui utas ini, saya menduga kelambatan denganxargs
yang Anda alami adalah karena jawaban asli digunakanxargs -n 1
ketika itu tidak benar-benar perlu.Ini sama dengan metode Anda, kecuali yang
xargs
secara otomatis berkaitan dengan panjang baris perintah maksimum:xargs
dapat menjalankan proses secara paralel juga. Metode 2 denganxargs
:Di atas menggunakan maksimal 5 proses untuk menangani maksimal 100 argumen dalam setiap proses. Anda dapat bereksperimen dengan argumen untuk menemukan yang terbaik untuk kebutuhan Anda.
sumber
Jika Anda memiliki tag yang dibuat dimulai dengan karakter # , misalnya
#ST002
, Anda mungkin menemukan bahwa Anda tidak dapat menghapus menggunakan pola normal. yaituTidak akan menghapus tag, tetapi membungkusnya dengan String Literal seperti itu
Itu akan dihapus. Berharap itu akan membantu seseorang yang membuat kesalahan menggunakan # untuk menulis nama tag.
sumber
Berikut ini adalah testcase lokal untuk mengujinya secara lokal tanpa mengacaukan remote:
sumber
Hai hanya ingin berbagi alias yang saya buat yang melakukan hal yang sama:
Tambahkan berikut ini ke ~ / .gitconfig Anda
Penggunaannya terlihat seperti:
sumber