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 fetch
ve 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 --tags
itmek 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-sha1
Değeri her sıfır "boş" SHA-1 etiket yaratılıyor eğer olduğunu. new-sha1
Etiketi 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 push
adı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, push
aktarmanı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 push
push'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 push
2 aracılığıyla mümkündür push
. Uzaktan kumandanın adının origin
ve silmesini istediğiniz etiketin dev
:
git push origin :refs/tags/dev
Bu, uzaktan kumandadan etiketi silmesini ister. dev
Yerel deponuzda etiketin varlığı veya yokluğu önemsizdir; bu tür push
ile, 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
, dev
bazı taahhütlü veya açıklamalı etiket repo nesnesine işaret eden yerel bir etiketiniz varsa , yeni dev
etiketinizi 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 push
yalnızca bu refspec itmek:
git push --force origin refs/tags/dev:refs/tags/dev
(not: --tags
açı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 push
silmek için kullanma) , uzaktan kumandaya erişen herkesin dev
etiketin 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ı.)