Bagaimana cara menghapus tag jarak jauh?

3421

Bagaimana Anda menghapus tag Git yang sudah didorong?

markdorison
sumber

Jawaban:

5754

Anda hanya perlu mendorong referensi 'kosong' ke nama tag jarak jauh:

git push origin :tagname

Atau, lebih ekspresif, gunakan --deleteopsi (atau -djika 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

Latar Belakang

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.

Adam Franco
sumber
187
+1 untuk menjawab pertanyaan dan menjelaskan kasus umum, dan merinci arti sintaksis yang belum dijabarkan
Peter Host
77
Dan kalau-kalau ada orang bertanya-tanya bagaimana menghapus beberapa tag pada saat Anda daftar sederhana menggunakan spasi, misalnya git push --delete origin tag1 tag2. Hal yang sama berlaku untuk penghapusan tag lokalgit tag -d tag1 tag2
dVaffection
8
Jika nama tag bertabrakan dengan nama cabang, Anda mungkin berakhir dengan menghapus cabang Anda. Ha ha. Lihat jawaban kedua - lebih ekologis
zuba
1
@EmmaHe A taghanya melekat pada satu komit. Karena itu nama cabang tidak relevan.
cb2
1
Sangat menarik untuk mengetahui bahwa 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.
DarkFranX
383

Cara yang lebih mudah adalah

git push --delete origin YOUR_TAG_NAME

Sintaksis titik awal IMO agak aneh dalam situasi ini

quexer
sumber
4
Saya pikir ini adalah cara yang tepat ... sintaks lain lebih mirip hacks bagi saya.
Luigi R. Viggiano
11
Yap, ini sederhana dan berhasil. Meskipun saya akan mengklarifikasi jawabannya dengan menentukan apa bagian variabel git push --delete origin "TAGNAME":, di mana TAGNAME adalah nama dari tag asli.
Teemu Leisti
12
Ini bekerja. Satu tambahan: Jika Anda memiliki cabang dan tag dengan nama yang sama, Anda dapat meletakkan kata di tagdepan nama tag Anda untuk memastikan Anda mendapatkan tag, bukan cabang.
andypaxo
9
@andypaxo Apa perintah dibutuhkan adalah refspecs, cara yang benar akan awalan tag dengan refs/tags/, seperti ini: refs/tags/v2.3.1.
p3lim
Saya memiliki nama tag 'buruk' yang dibuat pada server jarak jauh, yang memiliki karakter khusus, jadi saya tidak dapat menyinkronkannya, jadi cukup hapus dengan saran Anda: git push --delete origin "service-- <default> - 151 ", tidak dapat menghapusnya bukan dengan intellij, tidak dengan simpanan, tidak dengan sourceTree. Terima kasih!
Dmitri Algazin
215

Jika Anda memiliki tag jarak jauh v0.1.0untuk 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.

Alex Dean
sumber
2
ini juga bekerja dengan jgit. steno tag: tidak berfungsi dengan jgit
rynop
Saya mendapat fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1...?
Chaim Eliyah
3
@ ChaimEliyah Anda memiliki garis miring, mungkin itu masalah Anda
Joffrey
5
Jawaban yang lebih baik, karena ini juga berfungsi jika Anda memiliki cabang dan tag yang disebut sama.
Erik A. Brandstadmoen
Hanya :tagnameharus bekerja untuk penghapusan jarak jauh.
Acumenus
106

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
Siddhartha Mukherjee
sumber
2
Cara menghapus semua tag dari repo lokal dan jarak jauh. Ini yang saya cari, terima kasih!
Jorge Orpinel
git ambil, hapus remote dan kemudian bersihkan penduduk setempat, bekerja dengan indah!
DiegoRBaquero
lambat, tapi yang paling mudah
Lucent Fox
34

Untuk menghapus tag dari repositori jarak jauh:

git push --delete origin TAGNAME

Anda mungkin juga ingin menghapus tag secara lokal:

git tag -d TAGNAME
Andrea
sumber
jadi satu baris untuk melakukan keduanya:git push --delete origin TAGNAME && git tag -d TAGNAME
sakurashinken
25

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.

Mahmoud Zalt
sumber
3
git tag bukan tag
DSF
23
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
  1. Baris pertama, hapus your_tag_namedari repo lokal .
  2. Baris kedua, menghapus your_tag_namedari repo jarak jauh .
  3. Tekan tombol Buang konsep di bagian Rilis GitHub Anda .

masukkan deskripsi gambar di sini

kokabi
sumber
2
Sementara perintah ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya. Bagaimana Menjawab
Popo
20

Hapus tag lokal '12345'

git tag -d 12345

Hapus tag jarak jauh '12345' (misalnya; versi GitHub juga)

git push origin :refs/tags/12345

pendekatan alternatif

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

masukkan deskripsi gambar di sini

Berbohong CHIOUKH
sumber
15

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>'
Alex Vazquez Fente
sumber
Singkat dan ringkas. Posting ini bersama dengan MeganZhou muncul sebagai jawaban untuk mengapa kami mengalami masalah, nama cabang dan tagname identik. Saya menghapus tag lokal dan mendorong ke: ref / tag dan semuanya baik-baik saja.
rwheadon
12

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 xargsmemakan waktu terlalu lama, kecuali Anda punya waktu untuk membakar.

Berjuang, saya menemukan dua cara yang jauh lebih cepat. Untuk keduanya, mulai dengan git tagatau git ls-remote --tagsuntuk membuat daftar tag yang ingin Anda hapus pada remote. Dalam contoh di bawah ini Anda dapat menghilangkan atau mengganti sorting_proccessing_etcdengan greping, sorting, tailing atau heading yang Anda inginkan ( misalnya grep -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.

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 pushdengan 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).

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 xargsdan 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 " ")
TonyH
sumber
Anda harus membaginya menjadi beberapa jawaban yang berbeda. Jawaban dengan banyak tag pada satu baris, tanpa keraguan, jawaban yang tepat untuk penghapusan tag massal. Sebenarnya agak sulit untuk menemukan info ini hampir di tempat lain. Bahkan mengetahui apa yang saya cari, saya mengalami kesulitan menemukannya di halaman bantuan git :) Jadi kudos kepada Anda dan soroti itu sebagai jawaban yang tepat, dan pindahkan API GitHub ke tempat lain. Dan akhirnya, tag yang dihapus secara lokal, secara massal, bekerja dengan tag yang dibatasi ruang (singkirkan
usus besar
Terima kasih atas pujian dan sarannya. Saya akan membagi ini. Saya tidak mengerti komentar Anda tentang penghapusan tag lokal. Saya tidak berpikir cuplikan perintah terakhir saya menggunakan titik dua apa pun, tetapi saya menggunakan ponsel jadi mungkin melewatkan sesuatu.
TonyH
Maaf, saya hanya bermaksud bahwa apa yang Anda lakukan untuk menghapus tag jarak jauh, berfungsi dengan menghapus tag lokal, menyediakan seluruh daftar sekaligus. :) Hanya alih-alih git push origin: tag1: tag2 dll. Anda akan melakukan git tag --delete tag1 tag2 tag3 dengan cara itu Anda dapat melakukan pembersihan total. Sekali lagi terima kasih banyak!
CubanX
11

Jika Anda menggunakan SourceTree - GUI Git yang hebat - maka Anda dapat dengan mudah melakukan ini tanpa baris perintah dengan melakukan hal berikut:

  1. Buka repositori Anda di SourceTree
  2. Pilih dan rentangkan tab "Tag" di sebelah kiri
  3. Klik kanan pada tag yang ingin Anda hapus
  4. Pilih "Hapus YOUR_TAG_NAME"
  5. Di jendela verifikasi, pilih "Hapus Tag Dari Jarak Jauh"

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.

Chris Sprague
sumber
Bekerja seperti pesona. Terima kasih!
Native_Mobile_Arch_Dev
9

Jika Anda telah membuat tag yang disebut release01dalam 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

MeganZhou
sumber
7

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 $_ }
rsenna
sumber
Itu contoh regexp yang halus dan bagus. Terima kasih tuan yang baik
Yunus
7

Seperti yang disarankan oleh @CubanX, saya membagi jawaban ini dari yang asli:

Berikut adalah metode yang beberapa kali lebih cepat daripada xargsdan 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\"`

parallelmemiliki banyak mode operasi, tetapi umumnya memparalelkan perintah yang Anda berikan sambil memungkinkan Anda untuk menetapkan batas pada jumlah proses. Anda dapat mengubah --jobs 2parameter 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 xargsdan git tag -d, mana sudah cukup.

git tag | sorting_processing_etc | xargs -L 1 git tag -d
TonyH
sumber
Ini tampaknya jauh lebih rumit daripada jawaban yang diterima. Apa manfaatnya?
theUtherSide
2
Jika Anda perlu menghapus beberapa ribu tag, maka kecepatannya 10-100 kali lebih cepat
TonyH
Terima kasih telah mengklarifikasi. OP bertanya tentang menghapus satu tag. Saya tidak bisa membayangkan mengapa seseorang menggunakan pendekatan ini untuk satu tag. Mungkin jawaban ini lebih baik untuk pertanyaan lain yang melibatkan penghapusan banyak tag
theUtherSide
Saya pikir itu tidak ada. Saya bisa membuatnya untuk menjawab sendiri. Apakah Anda ingin berpikir itu pantas?
TonyH
1
Saya lakukan! Saya pikir ini praktik yang cukup umum di sini.
theUtherSide
6

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.

Richard Venable
sumber
6

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
Lucent Fox
sumber
5

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:

  • Buat file skrip shell (mis. Git-tag-purge.sh) dan tempel konten.
  • chmod file skrip Anda untuk membuatnya dapat dieksekusi.
  • Jadikan skrip tersedia secara global
  • cd ke proyek git Anda
  • Skrip panggilan (mis
    $> git-tag-purge.sh tag_name
    )
Dimitar Vlasev
sumber
4

Sepertinya banyak pekerjaan untuk sesuatu xargssudah dilakukan. Melihat ke belakang melalui utas ini, saya menduga kelambatan dengan xargsyang Anda alami adalah karena jawaban asli digunakan xargs -n 1ketika itu tidak benar-benar perlu.

Ini sama dengan metode Anda, kecuali yang xargssecara otomatis berkaitan dengan panjang baris perintah maksimum:

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

xargsdapat 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.

HomerM
sumber
Menarik. Anda mempelajari sesuatu yang baru tentang perintah Unix setiap hari. Saya perlu menguji use case saya dengan alternatif ini.
TonyH
4

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.

MernXL
sumber
2

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
Adnan Y
sumber
1

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)
ranma2913
sumber