Git etiketini nasıl yeniden adlandırırsınız?


1219

Bugün bir proje için günlüklere bakıyordum ve bir süre önce bir etiket adını şişirdiğimi fark ettim. Etiketi yeniden adlandırmanın bir yolu var mı? Google yararlı bir şey göstermedi.

Etiketli sürümü kontrol edebileceğimi ve yeni bir etiket yapabileceğimin farkındayım, hatta denedim. Ancak bu, tam olarak doğru olmayan bir etiket nesnesi oluşturuyor gibi görünüyor. Bir kişi için,

git tag -l

diğer tüm etiketlere göre sıra dışı listeler. Bunun önemli olup olmadığı hakkında hiçbir fikrim yok, ancak yeni etiket nesnesinin istediğim gibi olmadığına inanmamı sağlıyor. Bununla yaşayabilirim, çünkü gerçekten sadece etiket adının dokümantasyonla eşleştiğini umuyorum, ancak bunu yapmanın doğru bir yolu olduğunu varsayarak "doğru" yapmayı tercih ederim.


Aynı çağrıyı mı kullandınız, yani eski etiket açıklamalı / imzalı etiketse, yeni etiket de bu tür mü yoksa hafif etiket mi?
Jakub Narębski

1
Hem yanlış eski etiket hem de istenen yeni etiket açıklamalı ve imzalanmamış olmalıdır. Eski etiket 'git tag -a bad_tag_name' ile oluşturuldu, bu yüzden 'git tag -a good_tag_name' satırları boyunca bir şeyler yapmak istiyorum.
Brandon Fosdick

Ben de bu büyülü etiket yeniden adlandırma işleminin yeniden adlandırılmakta olan etiketinden ek açıklama korumak için işaret istiyorum. Aslında, sadece adı değiştirmek ve başka bir şey değiştirmek istemiyorum.
Brandon Fosdick

7
git log --oneline --decorate --graphetiketleri temizlerken yardımcı olur.
Joel Purra

Bir satırda bir etiketi yeniden adlandırabilirsiniz: aşağıdaki
yanıtıma

Yanıtlar:


2038

Bir etiketi şu oldşekilde yeniden adlandırıyorum new:

git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags

Push komutundaki iki nokta üst üste etiketi uzak depodan kaldırır. Bunu yapmazsanız Git, çektiğinizde makinenizde eski etiketi oluşturur.

Son olarak, diğer kullanıcıların silinen etiketi kaldırdığından emin olun. Lütfen onlara (iş arkadaşlarınıza) aşağıdaki komutu çalıştırmalarını söyleyin:

git pull --prune --tags

Açıklamalı bir etiketi değiştiriyorsanız , yeni etiket adının, silmek üzere olduğunuz eski açıklamalı etiket nesnesine değil, altta yatan işleme başvurduğundan emin olmanız gerektiğini unutmayın. Bu nedenle, git tag -a new old^{}yerine kullanın git tag new old(bunun nedeni açıklamalı etiketlerin hafif etiketler olmasa da nesneler olmasıdır , bu yanıtta daha fazla bilgi vardır ).


19
etiket açıklanırsa, yeni etiket eskisinin mesajına sahip olmaz, ancak bu yararlı bir bilgi
NickSoft

25
@NickSoft, yukarıda ek açıklama eklenmiş etiketlerle yaptım. Mesajlar eskiden yeniye kopyalandı. Belki de git'in daha yeni bir sürümü var?
katyhuff

25
git push origin :refs/tags/oldgit push origin :oldbence basitleştirilebilir .
Jesse Glick

25
Ben bu git "git push origin refs / tags / new" daha açık olması için "git push --tags" değiştirilmesini öneririm. Yanlışlıkla başka etiketleri zorlamak istemezsiniz.
chrish

11
Uyarı : Kullanmak , eski etiketin taahhüdünü değil , eski etiketi git tag new oldişaret eden bir etiket oluşturur . (Bkz.
Etiketime

297

İlk OLD takma adı olarak YENİ oluşturun:: Orijinal soru kolaydır bir etiketi, yeniden adlandırmak nasıl oldu git tag NEW OLDsonra ESKİ silin: git tag -d OLD.

"Git yolu" ve (in) akıl sağlığıyla ilgili teklif taban dışındadır, çünkü bir etiket adını korumaktan bahseder, ancak farklı bir depo durumuna atıfta bulunur.


3
Yukarıdaki cevap, işletmeyi içerdiği için biraz tercih edilir git push origin.
Roly

En kolay yol, Gitflow ile oluşturulan önceki sürüm etiketini yeniden adlandırmak için harika çalışıyor
RousseauAlexandre

5
Uyarı : Kullanmak , eski etiketin taahhüdünü değil , eski etiketi git tag new oldişaret eden bir etiket oluşturur . (Bkz.
Etiketime

118

Diğer cevaplara ek olarak:

İlk olarak, bir inşa etmek gerek diğer adı arasında eski işlemek orijinal işaret ederek, etiket adının:

git tag new old^{}

Ardından eski olanı yerel olarak silmeniz gerekir :

git tag -d old

Ardından uzak konumlarınızdaki etiketi silin:

# Check your remote sources:
git remote -v
# The argument (3rd) is your remote location,
# the one you can see with `git remote`. In this example: `origin`
git push origin :refs/tags/old

Son olarak yeni etiketinizi uzak konuma eklemeniz gerekir. Bunu yaptıktan kadar, yeni etiket (s) olmaz eklenecek:

git push origin --tags

Bunu her uzak konum için yineleyin.

Git Etiketi değişikliğinin bir paketin tüketicileri üzerindeki etkilerinin farkında olun !


Uyarı : Kullanmak , eski etiketin taahhüdünü değil , eski etiketi git tag new oldişaret eden bir etiket oluşturur . (Bkz.
Etiketime

1
@StevenVascellaro Bağlantı için teşekkürler. Bir dahaki sefere, lütfen bir düzenleme dosyası gönderin - yanıtlama bir topluluk çabasıdır. Teşekkürler.
Kaiser

Henüz düzenleme yapmadım çünkü kodu kendim için test etmedim. (Bağlantılı sorudaki teslim tarihine dikkat edin)
Stevoisiak

Bunu yaptıktan git tag new old^{}sonra ihtiyacımız yok git tag new_tag_name old_tag_name(ilk adım).
Sayı 945

28

Yayınlanmışsa, silemezsiniz (katranlı ve tüylü olma riski olmadan). 'Git yolu':

Aklı başında olan şey. Sadece berbat olduğunu itiraf et ve farklı bir ad kullan. Diğerleri zaten bir etiket adı gördü ve aynı adı korursanız, iki kişinin "sürüm X" e sahip olması durumunda olabilirsiniz, ancak aslında farklı "X" lere sahip olabilirler. Bu yüzden sadece "X.1" deyin ve işinizi bitirin.

Alternatif olarak,

Çılgınca şey. Diğerleri eskisini görmüş olsa bile, gerçekten yeni sürümü "X" olarak adlandırmak istiyorsunuz. Yani eskisini henüz yayınlamamışsınız gibi git-tag -f'yi tekrar kullanın.

Çok çılgınca çünkü:

Git, kullanıcıların arkasındaki etiketleri değiştirmez (ve değiştirmemelidir). Birisi eski etiketi zaten almışsa, ağacınızda bir git-pull yapmak sadece eskisinin üzerine yazmasını sağlamamalıdır.

Birinin sizden bir yayın etiketi alması durumunda, kendi etiketinizi güncelleyerek etiketini değiştiremezsiniz. Bu büyük bir güvenlik sorunudur, çünkü insanlar etiket adlarına güvenmelidirler. Eğer gerçekten çılgınca bir şey yapmak istiyorsanız, sadece bunu düşünmeniz ve insanlara batırdığınızı söylemeniz gerekir.

Tüm sayfaların izniyle .


6
Veya bu yanlış adlandırılmış etiketi (doğru adla) etiketleyebilirsiniz.
Jakub Narębski

6
Teşekkürler, zaten bir milyon kez bu adam sayfasını aştım. Neyse ki kötü etiket hiçbir yerde yayınlanmadı. Olsa bile, bu dahili bir projedir ve (şimdilik) tek geliştiriciyim. Hem katrandan hem de tüylerden oldukça güvende olduğumu düşünüyorum, ama sadece doktora uymak için repoyu alabilirsem.
Brandon Fosdick

Bazen kendi kişisel referanslarım için etiketler kullanıyorum. Örneğin. bir 'ok_jb' etiketi olabilir. Bunu kullanıyorum, çünkü birlikte çalıştığım insanların bazıları platformum için inşa edilemiyor, bu yüzden bazen derleme hataları olacak. Daha sonra, bu etiketi kontrol ederek derlenen bir sürümü alabilirim. Yeni kaynaklar oluşturulduğunda, etiketi taşıyordum veya ## sürümlerine yeniden adlandırıyorum, burada ## bir sayıdır (projeye bağlı olarak). Etiket ekleyerek özel bir özelliğin ne zaman tanıtıldığını da vurgulayabilirim.

7
Kötü cevap. "Yapma" asla "Nasıl yapabilirim?" Kullanıcı bunu yapmanın iyi bir fikir olduğunu düşünüp düşünmediğini veya insanların bunu beğenip beğenmeyeceğini sormuyordu. Birisi "Elimi nasıl kesebilirim" diye sorarsa, ona nasıl yapıldığını söyleyin ya da yalnız bırakın ama bir elin kesilmesinin bu kadar iyi bir fikir olmayabileceğini söyleyen birine ihtiyacı olmayacak. Ve yapabilirsin. Uzak bir depoda bile yeni bir etiket ekleyebilir ve eskisini silebilirsiniz, teknik olarak mümkündür.
Mecki

5
Bu, "Mevcut bir etiketi farklı bir düzeltmeye nasıl işaret edebilirim?" Sorusunu yanıtlıyor gibi görünüyor. OP sorusu yerine "Etiketi nasıl yeniden adlandırabilirim?" Ayrıca, dağınık insanlara anlatmanın sorunu nasıl çözeceği de belli değil (genel olarak iyi bir fikir olsa da).
LarsH

25

Bu wiki sayfasında birkaç ilginç referansı itebileceğimizi hatırlatan şu ilginç tek satır var :

git push origin <refs/tags/old-tag>:<refs/tags/new-tag> :<refs/tags/old-tag> && git tag -d <old-tag>

ve diğer klonlayıcılardan git pull --prune --tags

Fikir itmek:

  • <new-tag>başvuruda bulunduğu her kaydedilmesini için <old-tag>: <refs/tags/old-tag>:<refs/tags/new-tag>,
  • silme<old-tag> ::<refs/tags/old-tag>

Örnek olarak " Git deposundaki etiketlerin adlandırma düzenini değiştirilsin mi? "


Bu ek açıklamaları koruyor mu?
Brandon Fosdick

1
Bunun , ek açıklama eklenmiş etiketler için ek açıklamadaki orijinal etiket adını bıraktığına dikkat edin !! En azından mevcut sürümlerde bunun bir şey ifade edip etmediğinden emin değilim.
gbr

@gbr Cevabı, ek açıklamada "orijinal etiket adının" bırakıldığını gösteren bir örnekle düzenleyebilir misiniz?
VonC

1
@VonC Ne istediğini anladığımdan emin değilim; belki de net değildim: ek açıklama nesneleri, etiketin adına ayarlanmış bir etiket alanı içerir git cat-file -p <tag>; benim sistemde yöntem ile 'yeniden adlandırılmış' etiketi ref ( <new-tag>) almak, ama etiket alanı hala <old-tag>.
gbr

3
@gbr OP'nin istediği bu değil mi? "Bu sihirli etiket yeniden adlandırma işleminin, yeniden adlandırılmakta olan etiketten ek açıklamayı korumak istediğini de belirtmeliyim. Aslında, yalnızca adı ve başka hiçbir şeyi değiştirmek istemiyorum" ( stackoverflow.com/questions/1028649/ nasıl-do-you-rename-a-git-tag /… )
VonC

25

Diğer cevaplara bir ek olarak, daha tanıdık bir * nix move komutu hissi ile hepsini tek adımda yapmak için bir takma ad ekledim. Bağımsız değişken 1 eski etiket adı, bağımsız değişken 2 yeni etiket adıdır.

[alias]
    renameTag = "!sh -c 'set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags' -"

Kullanımı:

git renametag old new

En başarısız beri bu benim için işe yaramadı !sh(Windows Git ilişkin soruyla) aşağıdakilere biçimini güncelledikten sonra, ancak, işe yaradı: renametag = "!f() { git tag $2 $1; git tag -d $1; git push origin :refs/tags/$1; git push --tags; }; f".
Sunny Patel

10

Bir veya birkaç etiket için 3 adımlı yaklaşımı izleyin.

1. Adım: Geçerli etiketin işaret ettiği taahhüdü tamamlama / nesne kimliğini belirleme

     command: git rev-parse <tag name>
     example: git rev-parse v0.1.0-Demo
     example output: db57b63b77a6bae3e725cbb9025d65fa1eabcde

2. Adım: Etiketi depodan silin

     command: git tag -d <tag name>
     example: git tag -d v0.1.0-Demo
     example output: Deleted tag 'v0.1.0-Demo' (was abcde)

3. Adım: Eski etiketin işaret ettiği aynı taahhüt kimliğini gösteren yeni bir etiket oluşturun

     command: git tag -a <tag name>  -m "appropriate message" <commit id>
     example: git tag -a v0.1.0-full  -m "renamed from v0.1.0-Demo" db57b63b77a6bae3e725cbb9025d65fa1eabcde
     example output: Nothing or basically <No error>

Yerel git etiket adı değişikliği ile hazır olduğunda, bu değişiklikler başkalarının bunları alması için başlangıç ​​noktasına geri itilebilir.


Silinen etiketi geri itme git push origin :refs/tags/v0.1.0-Demove etiketleri geri itme adımları (diğer bekleyen şeylerle)git push --tags
Star Wolf

6

Maceracı için tek bir komutta yapılabilir:

mv .git/refs/tags/OLD .git/refs/tags/NEW

7
Eğer referanslarınız paketlenmişse bu işe yaramaz, yani git gcyakın zamanda
yayınladıysanız

2
Bu sadece yerel repoyu etkileyecektir. Uzaktan kumandanız varsa, bunun hangi olumsuz etkilere neden olabileceğinden emin değilim. Bu yaklaşımı önermiyorum.
therealklanni

1
Ek açıklama eklenmiş etiketler için, diğer şeylerin arasındaki 'ek açıklama' blobunun etiketin orijinal adını içerdiği için bunun daha da zahmetli olacağını unutmayın. Aslında bunun bir şey tarafından kullanılıp kullanılmadığından emin değilim (umarım en azından doğrula-etiketi ile), ama şansım olmazdı.
gbr

1
@gbr Bu gayet iyi çalışıyor. (Elbette @forivall'un notu dikkate alınmalıdır.) Bu hile ALT Sisifos inşa sistemindeki çağlar için büyük ölçüde kullanılmıştır. Bir paketin kaynaklarının nasıl saklandığına bakın, örneğin: git.altlinux.org/gears/g/gear.git . 2.0.7-alt1 gibi okunabilir etiketler , bakımcılar tarafından derleme sistemine gönderilen imzalı etiketlerdir. Grip-sisyphus-task164472.200 şifreli etiketleri , bu kaynaktan pkg'yi oluşturan ve yayınlayan görev kimliğini izlemek için derleme sistemi tarafından buraya konur. Bunlar, bakıcının cpmesajına dokunulmadan aptal kopyalardır ( ).
imz - Ivan Zakharyaschev

@ imz - IvanZakharyaschev Bildiğim kadar iyi, bazı ürünlerde gelecekte sorunlara yol açmayacak olmasına rağmen çok fazla güvenmem. git depoları biçimi ve beklenen etkileşimin gerçek bir özelliği yoktur, bu yüzden uygun olduğunda işleri en az şaşırtıcı şekilde temiz bir şekilde yapmaya çalışırım
gbr

3

Önceden itilmiş olan etiketleri itme ve etiketleri yeniden adlandırma ile ilgili sorunlardan bağımsız olarak, yeniden adlandırılacak etiketin açıklamalı etiket olması durumunda, öncelikle aşağıdaki tek satırlı komut satırı sayesinde kopyalayabilirsiniz:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}

Ardından, eski etiketi silmeniz gerekir:

git tag -d old_tag

Bu komut satırını aşağıdaki iki cevap sayesinde buldum:

Düzenleme:
ayar etiketlerin otomatik senkronizasyon kullanarak sorunlarla karşılaştı olması fetch.pruneTags=true(anlatıldığı gibi https://stackoverflow.com/a/49215190/7009806 için), ben şahsen önermek ilk sunucuda yeni etiketi kopyalayıp daha sonra eskisini silin. Bu şekilde, eski etiketi silerken yeni etiket rastgele silinmez ve etiketlerin senkronizasyonu henüz sunucuda olmayan yeni etiketi silmek ister . Örneğin, hep birlikte:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
git push --tags
git tag -d old_tag
git push origin :refs/tags/old_tag

3

Eski etiketleri / dalı yeni bir adla çoğaltarak ve eski etiketleri tek bir git pushkomutta silerek, uzak etiketleri kontrol etmeden yeniden adlandırabilirsiniz .

Uzaktan etiketi yeniden adlandırma / Uzaktan şube → etiketi dönüşüm: (Not: :refs/tags/)

git push <remote_name> <old_branch_or_tag>:refs/tags/<new_tag> :<old_branch_or_tag>

Uzaktan şube yeniden adlandırma / Uzaktan etiket → şube dönüşüm: (Not: :refs/heads/)

git push <remote_name> <old_branch_or_tag>:refs/heads/<new_branch> :<old_branch_or_tag>

Uzak bir etiketi yeniden adlandırma çıktısı:

D:\git.repo>git push gitlab App%2012.1%20v12.1.0.23:refs/tags/App_12.1_v12.1.0.23 :App%2012.1%20v12.1.0.23

Total 0 (delta 0), reused 0 (delta 0)
To https://gitlab.server/project/repository.git
 - [deleted]               App%2012.1%20v12.1.0.23
 * [new tag]               App%2012.1%20v12.1.0.23 -> App_12.1_v12.1.0.23
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.