Hapus semua tag dari repositori Git


224

Saya ingin menghapus semua tag dari repositori Git. Bagaimana saya bisa melakukan itu?

Menggunakan git tag -d tagnamemenghapus tag tagnamesecara lokal, dan menggunakan git push --tagssaya memperbarui tag pada penyedia git.

Saya mencoba:

git tag -d *

Tapi saya melihat itu *berarti file dari direktori saat ini.

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

Anggap saya punya banyak tag, dan saya ingin menghapusnya semua.

Jawaban:


419
git tag | xargs git tag -d

Cukup gunakan filosofi Linux di mana Anda menyalurkan semuanya. Di Windows gunakan git bash dengan perintah yang sama.


136
Terima kasih. Perintah ini menghapus tag lokal. Saya biasa git tag -l | xargs -n 1 git push --delete originmenghapusnya dari remote.
Ionică Bizău

7
Dan di Windows?
CodeManX

7
@CoDEmanX Pada Windows Anda harus menggunakan git bash dengan perintah yang sama.
inf3rno

2
Tidak menghapus tag jarak jauh, juga sangat lambat untuk ribuan tag.
Adrian Baker

1
'xargs' tidak dikenali sebagai perintah internal atau eksternal pada windows 10
Gulzar

207

Untuk menghapus tag jarak jauh (sebelum menghapus tag lokal) cukup lakukan:

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

dan kemudian hapus salinan lokal:

git tag | xargs git tag -d

Hapus jauh terlalu lambat untuk lusinan tag.
ffxsam

5
Jawaban ini jauh lebih cepat jika Anda memiliki banyak tag jarak jauh: stackoverflow.com/a/34395864/747044
adriaan

Urutan perintah dalam jawaban ini mengasumsikan bahwa tidak ada tag hanya lokal.
Acumenus

Ini terlalu lambat, solusi di bawah ini lebih baik.
Root Fool

Jika Anda perlu memasukkan frasa sandi untuk komit, ini memerlukan frasa sandi untuk setiap tag. Solusi lain lebih baik.
kap

56

Mungkin lebih efisien untuk mendorong hapus semua tag dalam satu perintah. Apalagi jika Anda memiliki beberapa ratus.

Di shell non-windows yang sesuai, hapus semua tag jarak jauh:

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

Kemudian hapus semua tag lokal:

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

Ini harus OK selama Anda tidak memiliki 'nama tag Anda. Untuk itu, perintah berikut harus OK.

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

Cara lain untuk mengambil daftar baris, membungkusnya dengan tanda kutip, menjadikannya satu baris dan kemudian meneruskannya ke perintah mungkin ada. Mengingat ini adalah lingkungan menguliti kucing yang paling utama dan semuanya.


3
Saya memiliki beberapa ribu tag, menghapusnya satu per satu dari repo cloud jarak jauh membutuhkan waktu berhari-hari, dan ini diselesaikan.
Adrian Baker

Apa yang xargs -L 1dilakukan?
ymett

-L max-lines --max-lines [= max-lines] -l [max-lines] Gunakan paling banyak baris max-non-blank jalur input per baris perintah. Untuk '-l', maks-baris default ke 1 jika dihilangkan. Untuk '-L', argumennya wajib. Trailing blanks menyebabkan jalur input diteruskan secara logis pada jalur input berikutnya, untuk tujuan penghitungan baris. Tersirat '-x'. Bentuk '-l' dari opsi ini ditinggalkan karena mendukung opsi '-L' yang sesuai dengan POSIX. gnu.org/software/findutils/manual/html_node/find_html/…
Richard A Quadling

@RichardAQuadling Oke, tapi apa efeknya dalam menjawab? git tagmengembalikan tag, satu per baris, dan kemudian xargs -L 1mengeluarkannya satu per baris, jadi untuk apa?
ymett

Hmmm. Tampaknya tidak ada dalam konteks ini! Selain membuat segalanya lebih lambat!
Richard A Quadling

24

Untuk pengguna Windows yang menggunakan PowerShell:

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

Ini menghapus semua tag yang dikembalikan oleh git tagdengan mengeksekusi git tag -duntuk setiap baris yang dikembalikan.


23

Menambahkan ke jawaban Stefan yang tidak ada cara menghapus tag dari jarak jauh. Untuk windows PowerShell Anda dapat menjalankan ini untuk menghapus tag jarak jauh pertama diikuti oleh tag lokal.

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

19

Jika Anda tidak memiliki tag di repo lokal Anda, Anda dapat menghapus tag jarak jauh tanpa harus membawanya ke repo lokal Anda.

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

Jangan lupa ganti "asal" dengan nama pengendali jarak jauh Anda.


Luar biasa! Ini menghapus semuanya sekaligus. Perintah lainnya adalah menghapus satu setiap 2 detik
bebas


6

Anda juga bisa menggunakan:

git tag -d $(git tag)

ini tidak akan berfungsi jika Anda memiliki banyak tag, seperti ribuan
DixonD

dalam hal ini Anda dapat menggunakan sesuatu seperti: tag git -d $ (tag git | head -n 999) dan jalankan x kali
ViZeke

1

Karena semua opsi ini hanya berfungsi di linux, inilah jendela yang setara untuk siapa pun yang harus berurusan dengan itu:

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

1

Saya harus menghapus tag dengan awalan

misalnya, saya harus menghapus tag v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5

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

Untuk membuat daftar semua tag dengan awalan

git tag -l "v0.0.*"

Untuk menghapus tag

git tag -d $tag_names

Begitulah cara kerja pernyataan pertama


Cepat, sederhana, dan efektif. Bekerja, terima kasih!
Vedran Mandić

0

Powershell v7 mendukung langkah paralel jika Anda memiliki banyak tag upstream (asal) yang perlu Anda hapus:

git tag | foreach-object -Parallel { 
git push origin --delete $_ 
git tag -d $_ 
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.