Bagaimana Anda menghapus tag Git yang sudah didorong?
Bagaimana Anda menghapus tag Git yang sudah didorong?
Jawaban:
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 untuk git push --delete origin `git tag`
asumsi Anda menarik tag jarak jauh secara lokal. Itu berguna dalam lingkungan pengujian.
Cara yang lebih mudah adalah
git push --delete origin YOUR_TAG_NAME
Sintaksis titik awal IMO agak aneh dalam situasi ini
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 adalah origin
, maka cukup:
git push origin :refs/tags/v0.1.0
Jika Anda juga perlu menghapus tag secara lokal:
git tag -d v0.1.0
Lihat jawaban Adam Franco untuk penjelasan tentang :
sintaksis Git yang tidak biasa untuk dihapus.
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 :
git tag -l | xargs git tag -d
git fetch
Hapus semua tag jarak jauh
git tag -l | xargs -n 1 git push --delete origin
Bersihkan tag lokal
git tag -l | xargs git tag -d
Untuk menghapus tag dari repositori jarak jauh:
git push --delete origin TAGNAME
Anda mungkin juga ingin menghapus tag secara lokal:
git tag -d TAGNAME
git push --delete origin TAGNAME && git tag -d TAGNAME
Dari terminal Anda, lakukan ini:
git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}
Sekarang pergi ke Github.com dan menyegarkan, mereka menghilang.
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
your_tag_name
dari repo lokal .your_tag_name
dari repo jarak jauh .git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
Perhatikan saja, jika Anda memiliki cabang jarak jauh yang dinamai tag jarak jauh, perintah-perintah ini ambigu:
git push origin :tagname
git push --delete origin tagname
Jadi, Anda harus menggunakan perintah ini untuk menghapus tag:
git push origin :refs/tags/<tag>
dan yang ini untuk menghapus cabang:
git push origin :refs/heads/<branch>
Jika tidak, Anda akan mendapatkan kesalahan seperti ini:
error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
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
atau git ls-remote --tags
untuk membuat daftar tag yang ingin Anda hapus pada remote. Dalam contoh di bawah ini Anda dapat menghilangkan atau mengganti sorting_proccessing_etc
dengan grep
ing, sort
ing, tail
ing atau head
ing yang Anda inginkan ( misalnya grep -P "my_regex" | sort | head -n -200
dll ):
xargs
, dan bekerja dengan setidaknya beberapa ribu tag sekaligus.git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh
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. . .
tag1 becomes
tag2 ======> :tag1 :tag2 :tag3
tag3
Penggunaan git push
dengan tag format ini tidak mendorong apa pun ke setiap ref jarak jauh, menghapusnya (format normal untuk mendorong cara ini adalah local_ref_path:remote_ref_path
).
Setelah kedua metode ini, Anda mungkin juga ingin menghapus tag lokal Anda. Ini jauh lebih cepat sehingga kita dapat kembali menggunakan xargs
dan git tag -d
, mana sudah cukup.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
ATAU mirip dengan penghapusan jarak jauh:
git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
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.
Jika Anda telah membuat tag yang disebut release01
dalam repositori Git Anda akan menghapusnya dari repositori Anda dengan melakukan hal berikut:
git tag -d release01
git push origin :refs/tags/release01
Untuk menghapus satu dari repositori Mercurial:
hg tag --remove featurefoo
Harap referensi https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
Jika Anda menggunakan PowerShell, dan Anda ingin menghapus banyak dari mereka:
# Local tags:
git tag -l | foreach { git tag -d $_ }
# Remote tags:
git tag -l | foreach { git push --delete origin $_ }
Tentu saja, Anda juga dapat memfilternya sebelum menghapus:
git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
Seperti yang disarankan oleh @CubanX, saya membagi jawaban ini dari yang asli:
xargs
dan mungkin lebih berskala dengan tweaking. Ia menggunakan Github API , token akses pribadi, dan memanfaatkan utilitas 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
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
dan git tag -d
, mana sudah cukup.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
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.
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
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin
Hapus Semua Tag Lokal & Kecualikan Ekspresi Dari Hapus
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
Skrip sederhana untuk menghapus tag yang diberikan dari lokasi lokal dan asal. Dengan tanda centang apakah tag benar-benar ada.
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
Cara Penggunaan:
$> git-tag-purge.sh tag_name)
Sepertinya banyak pekerjaan untuk sesuatu xargs
sudah dilakukan. Melihat ke belakang melalui utas ini, saya menduga kelambatan dengan xargs
yang Anda alami adalah karena jawaban asli digunakan xargs -n 1
ketika itu tidak benar-benar perlu.
Ini sama dengan metode Anda, kecuali yang xargs
secara otomatis berkaitan dengan panjang baris perintah maksimum:
git tag | sorting_processing_etc | xargs git push --delete origin
xargs
dapat menjalankan proses secara paralel juga. Metode 2 dengan xargs
:
git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin
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.
Jika Anda memiliki tag yang dibuat dimulai dengan karakter # , misalnya #ST002
, Anda mungkin menemukan bahwa Anda tidak dapat menghapus menggunakan pola normal. yaitu
git tag -d #STOO2
Tidak akan menghapus tag, tetapi membungkusnya dengan String Literal seperti itu
git tag -d "#ST002" or git tag -d '#ST002'
Itu akan dihapus. Berharap itu akan membantu seseorang yang membuat kesalahan menggunakan # untuk menulis nama tag.
Berikut ini adalah testcase lokal untuk mengujinya secara lokal tanpa mengacaukan remote:
~/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
Hai hanya ingin berbagi alias yang saya buat yang melakukan hal yang sama:
Tambahkan berikut ini ke ~ / .gitconfig Anda
[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"
Penggunaannya terlihat seperti:
-->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)