Edit, 24 Kas 2016: Bu cevap görünüşte popüler, bu yüzden buraya bir not ekliyorum. Eğer varsa değiştirin merkezi bir sunucuda bir etiket, olan herkes eski zaten sahip olduğu merkezi sunucu veri havuzunun etiket herhangi klonu etiketi-ebil eski etiketini muhafaza . Bu size bunu nasıl yapacağınızı söylese de, gerçekten yapmak istediğinizden emin olun . Zaten silmek için "yanlış" etiketi var herkesi gerekir onların "yanlış etiket" ve yeni "doğru etiketiyle" ile değiştirin.
Git 2.10 / 2.11 sürümündeki sınama, eski etiketi tutmanın çalışan istemciler için varsayılan davranış olduğunu git fetchve güncelleştirmenin çalışan istemciler için varsayılan davranış olduğunu gösterir git fetch --tags.
(Orijinal cevap aşağıdadır.)
Etiketleri git push --tagsitmek istediğinizde, uzaktan kumandaya formun bir güncelleme isteğini gönderir (gerekli taahhütler ve diğer nesnelerle ve push ayarlarındaki diğer ref güncellemeleriyle birlikte) . (Ancak, birçok etiket gönderir: her etiket için bunlardan biri.)new-sha1 refs/tags/name
Güncelleme talebi uzaktan kumanda tarafından bir old-sha1(veya her etiket için bir tane) eklenecek şekilde değiştirilir , ardından ön alma ve / veya güncelleme kancalarına (uzaktan kumandada hangi kancalar varsa) gönderilir. Bu kancalar, etiket oluştur / sil / güncelle etiketine izin verip vermemeye karar verebilir.
old-sha1Değeri her sıfır "boş" SHA-1 etiket yaratılıyor eğer olduğunu. new-sha1Etiketi silinirse boş SHA-1 'dir. Aksi takdirde her iki SHA-1 değeri de gerçek, geçerli değerlerdir.
Kanca olmasa bile, bir tür "yerleşik kanca" da çalıştırılır: "kuvvet" bayrağını kullanmadığınız sürece uzaktan kumanda bir etiketi taşımayı reddeder ("yerleşik kanca" her ikisinde de sorun olmazsa) "ekle" ve "sil"). Gördüğünüz ret mesajı, bu yerleşik kancadan geliyor. (Bu arada, aynı yerleşik kanca aynı zamanda hızlı ileri olmayan şube güncellemelerini de reddeder.) 1
Ancak — neler olup bittiğini anlamanın anahtarlarından biri - git pushadımın uzaktan kumandanın bu etikete sahip olup olmadığı ve varsa SHA-1 değerine sahip olduğu hakkında hiçbir fikri yok. Yalnızca "SHA-1 değerleriyle birlikte eksiksiz etiket listem burada" yazıyor. Uzaktan kumanda, değerleri karşılaştırır ve ekleme ve / veya değişiklik varsa, bu kancaları çalıştırır. (Aynı etiketler için hiçbir şey yapmaz. Yapmadıkları etiketler için hiçbir şey yapmaz!)
Etiketi yerel olarak silerseniz, pushaktarmanız etiketi aktarmaz. Uzaktan kumanda herhangi bir değişiklik yapılmaması gerektiğini varsayar.
Etiketi yerel olarak silerseniz, yeni bir yere işaret ederek oluşturun, ardından pushpush'unuz etiketi aktarır ve uzaktan kumanda bunu bir etiket değişikliği olarak görür ve zorla itme olmadığı sürece değişikliği reddeder.
Böylece, iki seçeneğiniz vardır:
- zorla itmek veya
- uzaktan kumandadaki etiketi silin.
Etiketi yerel olarak silmek ve hiçbir etkisi olmamasına rağmen , ikincisi git push2 aracılığıyla mümkündür push. Uzaktan kumandanın adının originve silmesini istediğiniz etiketin dev:
git push origin :refs/tags/dev
Bu, uzaktan kumandadan etiketi silmesini ister. devYerel deponuzda etiketin varlığı veya yokluğu önemsizdir; bu tür pushile, bir refspec olarak, saf-silme itmek.:remoteref
Uzaktan kumanda, etiketin silinmesine izin verebilir veya vermeyebilir (eklenen ekstra kancalara bağlı olarak). Silme işlemine izin veriyorsa, etiket silinir ve bir saniye git push --tags, devbazı taahhütlü veya açıklamalı etiket repo nesnesine işaret eden yerel bir etiketiniz varsa , yeni devetiketinizi gönderin . Uzaktan kumandada, devşimdi yeni oluşturulan bir etiket olacak, bu yüzden uzaktan kumanda muhtemelen itmeye izin verecektir (yine bu, eklenen ekstra kancalara bağlıdır).
Zorla itme daha basittir. Eğer güncelleme şey emin olmak istiyorsanız diğer etiketi yerine, sadece söylemek git pushyalnızca bu refspec itmek:
git push --force origin refs/tags/dev:refs/tags/dev
(not: --tagsaçıkça yalnızca bir etiketi ref spesifikasyonuna itiyorsanız ihtiyacınız yoktur).
1 Elbette, bu yerleşik kancanın nedeni , aynı uzaktan repodaki diğer kullanıcıların beklediği davranışı güçlendirmeye yardımcı olmaktır: dalların geri sarılmaması ve etiketlerin hareket etmemesi. Zorla iterseniz, diğer kullanıcılara bunu yaptığınızı bildirmelisiniz, böylece bunu düzeltebilirler. "Etiketler hiç hareket etmiyor" un Git 1.8.2 tarafından yeni uygulandığını unutmayın; önceki sürümler, etiketin, dal adları gibi, kesinleştirme grafiğinde "ilerlemesine" olanak tanır. Bkz git 1.8.2 sürüm notlarını .
2 Uzaktan kumandadan oturum açabilmeniz önemsizdir. Sadece Git deposuna git ve koş git tag -d dev. Her iki şekilde de (uzaktan kumandadaki etiketi silme veya git pushsilmek için kullanma) , uzaktan kumandaya erişen herkesin devetiketin eksik olduğunu bulacağı bir süre olduğunu unutmayın . (Onlar sahip olmaya devam edecek kendi onlar zaten varsa, eski etiket ve hatta itmek olabilir onların yenisini zorlayabilir önce eski etiket Arkayı.)