Hari ini saya sedang melihat-lihat log untuk sebuah proyek dan menyadari bahwa saya gemuk memainkan nama tag beberapa waktu yang lalu. Apakah ada cara untuk mengganti nama tag? Google belum menemukan sesuatu yang berguna.
Saya menyadari bahwa saya dapat memeriksa versi yang ditandai dan membuat tag baru, saya bahkan mencobanya. Tapi itu sepertinya membuat objek tag yang kurang tepat. Untuk satu,
git tag -l
mencantumkannya dalam urutan relatif terhadap semua tag lainnya. Saya tidak tahu apakah itu signifikan, tetapi itu membuat saya percaya bahwa objek tag baru tidak cukup seperti yang saya inginkan. Saya dapat hidup dengan itu, karena saya benar-benar hanya peduli bahwa nama tag cocok dengan dokumentasi, tetapi saya lebih suka melakukannya "benar", dengan asumsi ada cara yang tepat untuk melakukan ini.
git log --oneline --decorate --graph
sangat membantu saat membersihkan tag.Jawaban:
Inilah cara saya mengganti nama tag
old
menjadinew
:Tanda titik dua dalam perintah push menghilangkan tag dari repositori jarak jauh. Jika Anda tidak melakukan ini, Git akan membuat tag lama pada mesin Anda saat Anda menarik.
Akhirnya, pastikan bahwa pengguna lain menghapus tag yang dihapus. Harap beri tahu mereka (rekan kerja) untuk menjalankan perintah berikut:
Perhatikan bahwa jika Anda mengubah tag beranotasi , Anda perlu memastikan bahwa nama tag baru merujuk komit yang mendasarinya dan bukan objek tag beranotasi lama yang akan Anda hapus. Oleh karena itu, gunakan
git tag -a new old^{}
alih-alihgit tag new old
(ini karena tag beranotasi adalah objek sementara tag ringan tidak, info lebih lanjut dalam jawaban ini ).sumber
git push origin :refs/tags/old
dapat disederhanakangit push origin :old
menurut saya.git tag new old
akan membuat tag yang menunjuk ke tag lama, bukan komit tag lama. (Lihat Mengapa saya tidak bisa checkout tag saya dari Git GUI? )Pertanyaan awal adalah bagaimana mengubah nama tag, yang mudah: pertama kali membuat BARU sebagai alias OLD:
git tag NEW OLD
kemudian menghapus OLD:git tag -d OLD
.Kutipan mengenai "cara Git" dan kewarasan tidak masuk akal, karena berbicara tentang mempertahankan nama tag, tetapi membuatnya merujuk ke status repositori yang berbeda.
sumber
git push origin
bisnis.git tag new old
akan membuat tag yang menunjuk ke tag lama, bukan komit tag lama. (Lihat Mengapa saya tidak bisa checkout tag saya dari Git GUI? )Selain jawaban lain:
Pertama, Anda perlu membuat alias dari nama tag lama , menunjuk ke komit asli:
Maka Anda perlu menghapus yang lama secara lokal :
Kemudian hapus tag pada Anda lokasi yang jauh:
Akhirnya Anda perlu menambahkan tag baru Anda ke lokasi yang jauh. Sampai Anda melakukan ini, tag baru tidak akan ditambahkan:
Iterasi ini untuk setiap lokasi terpencil.
Sadarilah, implikasi yang dimiliki perubahan Git Tag kepada konsumen suatu paket!
sumber
git tag new old
akan membuat tag yang menunjuk ke tag lama, bukan komit tag lama. (Lihat Mengapa saya tidak bisa checkout tag saya dari Git GUI? )git tag new old^{}
, maka kita tidak perlugit tag new_tag_name old_tag_name
(langkah pertama).Jika dipublikasikan, Anda tidak dapat menghapusnya (tanpa risiko menjadi tar dan berbulu, artinya). 'Cara Git' adalah melakukan:
Kalau tidak,
Ini sangat gila karena:
Semua milik halaman manual .
sumber
Halaman wiki ini memiliki one-liner yang menarik ini, yang mengingatkan kita bahwa kita dapat mendorong beberapa referensi :
Jadi idenya adalah untuk mendorong:
<new-tag>
untuk setiap komit direferensikan oleh<old-tag
>:<refs/tags/old-tag>:<refs/tags/new-tag>
,<old-tag>
::<refs/tags/old-tag>
Lihat sebagai contoh " Mengubah konvensi penamaan tag di dalam repositori git? ".
sumber
git cat-file -p <tag>
; dengan metode Anda di sistem saya, saya mendapatkan tag 'diubah namanya' (<new-tag>
), tetapi bidang tagnya masih<old-tag>
.Sebagai tambahan pada jawaban lain, saya menambahkan alias untuk melakukan semuanya dalam satu langkah, dengan nuansa perintah * nix move yang lebih akrab. Argumen 1 adalah nama tag lama, argumen 2 adalah nama tag baru.
Pemakaian:
sumber
!sh
(pertanyaan adalah mengenai Windows Git), namun, setelah memperbarui format dengan berikut ini, itu bekerja:renametag = "!f() { git tag $2 $1; git tag -d $1; git push origin :refs/tags/$1; git push --tags; }; f"
.Ikuti pendekatan 3 langkah untuk satu atau beberapa tag.
Langkah 1: Identifikasi komit / objek ID dari komit tag saat ini menunjuk ke
Langkah 2: Hapus tag dari repositori
Langkah 3: Buat tag baru yang menunjuk ke id komit yang sama seperti yang ditunjukkan oleh tag lama
Setelah git lokal siap dengan perubahan nama tag, perubahan ini dapat didorong kembali ke asal untuk diambil orang lain.
sumber
git push origin :refs/tags/v0.1.0-Demo
dan untuk mendorong tag kembali (dengan hal-hal lain yang tertunda)git push --tags
Untuk para petualang itu dapat dilakukan dalam satu perintah:
sumber
git gc
baru saja menjalankancp
), dengan pesan pengelola tidak disentuh.Terlepas dari masalah yang terkait dengan mendorong tag dan mengganti nama tag yang telah didorong, jika tag untuk mengganti nama adalah yang beranotasi , Anda dapat menyalinnya terlebih dahulu berkat baris perintah baris tunggal berikut:
Kemudian, Anda hanya perlu menghapus tag lama:
Saya menemukan baris perintah ini berkat dua jawaban berikut:
Edit:
Setelah mengalami masalah menggunakan sinkronisasi otomatis tag pengaturan
fetch.pruneTags=true
(seperti yang dijelaskan dalam https://stackoverflow.com/a/49215190/7009806 ), saya pribadi menyarankan untuk pertama menyalin tag baru pada server dan kemudian menghapus yang lama. Dengan begitu, tag baru tidak dihapus secara acak ketika menghapus tag lama dan sinkronisasi tag ingin menghapus tag baru yang belum ada di server . Jadi, misalnya, secara bersama-sama kita dapatkan:sumber
Anda juga dapat mengganti nama tag jarak jauh tanpa memeriksanya, dengan menduplikasi tag / cabang lama ke nama baru dan menghapus yang lama, dalam satu
git push
perintah.Terpencil tag rename / Remote cabang → konversi tag: (Notice:
:refs/tags/
)Terpencil cabang rename / Remote tag → konversi cabang: (Notice:
:refs/heads/
)Output mengganti nama tag jarak jauh:
sumber