Git etiketleri de itiliyor mu?


190

Depomu oluşturduğumdan, oluşturduğum etiketlerin depoya aktarılmadığı anlaşılıyor. git tagYerel dizinde yaptığımda tüm etiketler var, ancak uzak depoda oturum açtığımda ve a yaptığımda git tagyalnızca ilk birkaç tanesi görünüyor .

Sorun ne olabilir?


3
git push --follow-tagsşimdi yararlı olabilir, aşağıdaki cevabımı gör
VonC


1
Tekrarlıyorum: Bu daha eski olmasına rağmen, diğer soru daha iyi soruluyor.
Ciro Santilli 法轮功 at 病 六四 事件 法轮功

Yanıtlar:


247

Bunu yapabilirsin:

git push --tags

27
Eminim HEAD referanslarının itilmeyeceği anlamına gelir, yani SADECE etiketleri itersiniz.
Dan Rosenstark

47
"İş git push --tagsarkadaşlarınız tüm etiketleri zorlamak için eğitildiklerinde kötü etiketlerden kurtulmanın çok zor olabileceği için başkalarını kullanmamanızı veya kullanmamanızı tavsiye ederim , çünkü insanlar her zaman yerel olarak sahip oldukları eski kötü etiketleri itmeye devam ettikçe yeni bir etiket basmak istiyorum. Bu nedenle, yalnızca her birine birisinin git push origin <tag_name>şimdi kullanmasını tavsiye edeceğim . " - stackoverflow.com/a/5195913/4130619
etkinliği azaltma

Bence diğer cevap stackoverflow.com/a/16164809/11635 kabul edilmelidir.
Olmasa

140

Varsayılan git remote configuration'da etiketleri açıkça itmeniz gerekir ( işaret ettikleri taahhütlerle birlikte otomatik olarak getirilirken ). Kullanmalısın

$ git push <remote> tag <tagname>

tek bir etiketi itmek veya

$ git push <remote> --tags

tüm etiketleri itmek (veya git push --tagsvarsayılan uzaktan kumandayı kullanmak için origin).

Bu, etiketleri itmeyi açık hale getirmek için çok amaçlanan bir davranıştır. Etiketleri itmek genellikle bilinçli bir seçim olmalıdır.


Junio ​​C. Hamano'nun yazdıklarını özetleme (@Andre Miras tarafından yapılan yorumlara bağlı)

Getirirken, birinin yayınladığı uzak bir havuzla etkileşime giriyorsunuz, yani:

  1. mevcut olan bir dizi etiket, yayıncının insanların görmesini istediği tüm ve
  2. sadece siz değil, diğer kullanıcılar da aynı etiketleri görecek.

Başka bir deyişle, getirdiğiniz depolardaki etiketler herkese açık ve paylaşılan olacak şekilde tasarlanmıştır. Herkesin aynı etiketleri alması kolaysa geliştiriciler arasındaki iletişimi kolaylaştıracaktır.

Bu nedenle git fetchetiketleri otomatik olarak "takip eder", yani işaret ettikleri düzeltmeleri indirirken etiketleri indirir - diğer bir deyişle, alakalı tüm yayınlanmış etiketleri indirir .

İçe iterken, çoğu zaman herkese açık olmayan çalışma havuzunuzdan itiyorsunuzdur ve bu havuzdaki etiketler herkese açık olarak tasarlanmamıştır. İlerlemenizi işaretlemek için kendi yerel etiketlerinizi kullanabilirsiniz, bu nedenle etiketleri tanımınıza göre herkese açık olan, deponuzdaki tüm etiketleri, değişikliklerinizi yayınlamak için bastırdığınız depoya körü körüne itmek mantıklı değildir.

Bu nedenle etiketi herkese açık olarak işaretlemek için etiketi açıkça itmeniz gerekir.


Alternatif sen her zaman tüm etiketler, gözlerinde o gibi mesela koymak şey itmek için itme uzak yapılandırabilirsiniz .git/config:

[uzak "yayınla"] # veya adı ne olursa olsun
    url = ...
    push = + refs / kafaları / *: refs / kafaları / *
    push = + refs / tags / *: refs / tags / *

Bu, tüm kafaları (tüm dalları) ve tüm etiketleri zorla itmek anlamına gelir (kafaların zorla itilmesini istemiyorsanız, refspec'ten '+' önekini kaldırın).


Bu her zaman tüm kafaların 'zorla itmesini' sağlamaz mı?
Stefan Näwe

@ Stefante: Evet öyle. Güncellenmiş.
Jakub Narębski

19
"Bu, itme etiketlerini açık hale getirmek için çok amaçlanan bir davranıştır. Etiketleri itmek genellikle bilinçli bir seçim olmalıdır." Gerekçeyi anlamıyorum. Git'in etiketleri otomatik olarak itmesinin neden kötü olacağını açıklayabilir misiniz?
Ryan Lundy

13
@Kyralessa, bu yazıda git.661346.n2.nabble.com/… , Junio ​​C Hamano ( Git'in şu anki sürdürücüsü) etiketleri otomatik olarak itmenin neden kötü bir şey olduğunu açıklıyor.
Andre Miras

@AndreMiras Bu harika bağlantı için teşekkür ederim. Junio'nun gönderisini bu cevaba entegre edebilmemiz güzel olurdu.
Homer6

67

Git 1.8.3'ten (22 Nisan 2013) bu yana , dalları itmek ve ardından etiketleri itmek için 2 komut yapmanız gerekmediğini unutmayın:

Yeni " --follow-tags" opsiyonu " git push", dalları dışarı iterken ilgili ek açıklamalı etiketleri itmesini söyler .

Artık yeni taahhütleri uygularken deneyebilirsiniz:

git push --follow-tags

Bu, tüm yerel etiketleri zorlamaz, yalnızca taahhütlerle başvurulan açıklamalı etiketler git push.


Bu, c2aba15'te Junio ​​C Hamano ( gitster) tarafından tanıtıldı :

Yeni seçenek " --follow-tags" git push, diğer taraftan eksik olan ve aksi takdirde dışarı itilen geçmişin erişebileceği açıklamalı etiketleri itmesini "söyler" .

Örneğin, " simple", " current" veya " upstream" push tuşlarını kullanıyorsanız, normalde geçmişinizde mevcut olana HEADve başka hiçbir şeye yol açmayan geçmişi itersiniz .
Bu seçenekle, bu işlemden diğer tarafa ulaşılabilen tüm açıklamalı etiketleri de itersiniz.


Yapılandırma varsayılan push.followTagsolarak eklemeye izin verir --follow-tags(Git 2.4.1+, Q2 2015). Bkz. " Push git komutlarını ve etiketleri aynı anda "


3
Bu yalnızca tüm açıklamalı etiketleri iter . Çoğu kişi / proje hafif etiketler kullanıyor . Yani çoğu durumda git push --follow-tagsdaha fazla git push
Jarl

3
@ Evet evet, cevabımda "açıklamalı" ifadesinden bahsettim. Ancak gerçekten yalnızca açıklamalı etiketler kullandım, yalnızca dahili kullanım için hafif etiketler ayırdık (yani hiçbir zaman itilmemeliydim).
VonC

@VonC: Şimdi burada belirttiğiniz gibi, bunu varsayılan yapan bir yapılandırma seçeneği de var: stackoverflow.com/a/3745250/946850
krlmlr

19

Genelde yaptığım şey:

[uzak "yayınla"] # veya adı ne olursa olsun
    url = ...
    push =:
    push = + refs / tags / *: refs / tags / *

Yani zaten orada bulunan her dalı ve etiketleri iter. İtmeyi zorlamaz ve manuel olarak itmediğiniz dalı itmez.


Bunu aynı zamanda kullanıcımın global git yapılandırmasına da koyabilir miyim? Evetse, nasıl? Teşekkürler! :)
gucki

Etiketleri zorladığınıza benziyor, ancak dalları değil.
Adrian Ratnapala

Evet, ve hayır, yazdım, yeni etiketleri itecek, onları zorlamaya zorlamayacak ve daha önce kendinizi zorlamadığınız dalları itmeyecek.
mat

Jakub'un önerisini denedim, ancak sadece yerel olarak istediğim dalları zorluyordu. Bu öneri, mat, mükemmel çalışıyor. Etiketleri senkronize eder, ancak uzak izleme dalları olmadıkça dalları senkronize etmez (yani, yeni dalları uzaktan kumandaya itmez, ancak zaten uzaktan kumandadaylarsa günceller). NOT: bir etikete ve aynı ada sahip bir şubeniz varsa "birden fazla eşleşir" hatası alırsınız. Bakınız lostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/ .
josephdpurcell

5

Ve tüm etiketleri almaya zorlamak istiyorsanız, bunu yapılandırmada ayarlayabilirsiniz:

git config remote.origin.tagopt --tags

Dokümanlardan:

Bu değerin --no-tags olarak ayarlanması uzaktan kumanda getirilirken otomatik etiket takibini devre dışı bırakır. --Tags olarak ayarlamak, uzak şube başlıklarından erişilemese bile her etiketi uzaktan alır. Bu bayrakları doğrudan git-fetch'e (1) geçirmek bu ayarı geçersiz kılabilir. Git-fetch (1) seçeneklerinin --tags ve --no-tags seçeneklerine bakın.


1
Soru daha 'itme' odaklıydı, cevabınız uzaktan kumandayı iterken de geçerli mi?
a1an
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.