As tags do git também são empurradas?

Desde que criei meu repository, parece que as tags que eu tenho criado não são enviadas ao repository. Quando eu faço git tag no diretório local, todas as tags estão presentes, mas quando eu faço logon no repository remoto e faço uma tag git, apenas as primeiras aparecem.

Qual poderia ser o problema?

Você poderia fazer isso:

 git push --tags 

Na configuração remota padrão do git você tem que empurrar as tags explicitamente (enquanto elas são buscadas automaticamente junto com os commits que elas apontam). Você precisa usar

 $ git push  tag  

para empurrar uma única tag ou

 $ git push  --tags 

para empurrar todas as tags (ou git push --tags para empurrar para o padrão remoto, geralmente origin ).

Este é um comportamento muito intencional, para tornar as tags de push explícitas. Empurrando tags deve ser geralmente escolha consciente.


Resumindo o que Junio ​​C. Hamano escreveu (ligado nos comentários de @Andre Miras)

Ao buscar, você está interagindo com um repository remoto que alguém publicou, o que significa:

  1. o conjunto de tags que existem lá é tudo que o editor queria que as pessoas vissem e
  2. não só você, mas outras pessoas também verão as mesmas tags.

Em outras palavras, as tags nos repositorys que você busca são projetadas para serem públicas e compartilhadas. Isso facilitará a comunicação entre os desenvolvedores se for fácil para todos buscar essas mesmas tags.

É por isso que o git fetch automaticamente “segue” as tags, isto é, ele baixa as tags ao fazer o download das revisões para as quais elas apontam – em outras palavras, baixa todas as tags publicadas relevantes.

Ao pressionar, você está empurrando de seu repository de trabalho, que na maioria das vezes não é público, e as tags nesse repository não são projetadas para serem públicas. Você pode usar suas próprias tags locais para marcar seu progresso, então não faz sentido empurrar cegamente todas as tags em seu repository para o repository que você está empurrando para publicar suas mudanças, cujas tags são, por definição, públicas.

É por isso que você precisa enviar a tag explicitamente para marcar a tag como pública.


Alternativamente, você pode configurar o controle remoto ao qual você pressiona para sempre pressionar todas as tags, por exemplo, colocar algo assim em seu .git/config :

 [remote "publish"] # ou seja qual for o nome
     url = ...
     push = + refs / heads / *: refs / heads / *
     push = + refs / tags / *: refs / tags / *

Isso significa forçar todas as cabeças (todas as ramificações) e todas as tags (se você não quiser forçar o envio de headers, remova o prefixo ‘+’ do refspec).

Note que desde o git 1.8.3 (22 de abril de 2013) , você não precisa mais fazer 2 comandos para empurrar filiais, e então para empurrar tags:

A nova opção ” --follow-tags ” diz ” git push ” para enviar tags anotadas relevantes ao empurrar as ramificações para fora .

Agora você pode tentar, ao enviar novos commits:

 git push --follow-tags 

Isso não vai empurrar todas as tags locais, apenas as anotadas referenciadas por commits que são empurradas com o git push .


Isto foi introduzido no commit c2aba15 por Junio ​​C Hamano ( gitster ) :

A nova opção “- --follow-tags ” diz ” git push ” para enviar tags anotadas que estão faltando do outro lado e que podem ser acessadas pelo histórico que é empurrado para fora.

Por exemplo, se você estiver usando o push ” simple “, ” current ” ou ” upstream “, normalmente você empurrará o histórico que leva ao commit em seu HEAD atual e nada mais.
Com essa opção, você também envia todas as tags anotadas que podem ser acessadas desse commit para o outro lado.


A configuração push.followTags permite include --follow-tags por padrão (Git 2.4.1+, Q2 2015). Consulte ” Enviar commits e tags git simultaneamente ”

O que eu costumo fazer é:

 [remote "publish"] # ou seja qual for o nome
     url = ...
     empurrar =:
     push = + refs / tags / *: refs / tags / *

Significa que ele empurra todos os ramos que já estão lá, além de tags. Não força o impulso, e não empurra o ramo que você não empurrou manualmente.

E se você quiser forçar a busca de todas as tags, você pode configurá-lo na configuração por:

 git config remote.origin.tagopt --tags 

Dos docs:

Configurar esse valor para –no-tags desativa o acompanhamento automático de tags ao buscar a partir do controle remoto. Configurá-lo para –tags irá buscar todas as tags remotas, mesmo que elas não estejam acessíveis a partir de cabeças de ramificação remotas. Passar esses flags diretamente para git-fetch (1) pode sobrescrever esta configuração. Veja as opções –tags e –no-tags do git-fetch (1).