As tags git também são enviadas?


188

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

Qual poderia ser o problema?.


3
git push --follow-tagsagora pode ser útil, ver minha resposta abaixo
VonC


1
Concordo com o duplicado: embora seja mais antigo, a outra questão é melhor colocada.
Ciro Santilli escreveu:

Respostas:


244

Você pode fazer isso:

git push --tags

27
Tenho certeza de que isso significa que os árbitros HEAD não serão pressionados, o que significa que você APENAS pressiona as tags.
Dan Rosenstark 7/10/12

47
"Eu recomendo não usar ou treinar outras pessoas para usar git push --tags, pois pode ser muito difícil livrar-se de tags ruins quando seus colegas de trabalho são treinados para enviar todas as tags, pois as pessoas continuam enviando as tags ruins antigas que eles têm localmente toda vez que deseja empurrar uma nova tag. Por isso, aconselharei todos a usar git push origin <tag_name>agora. " - copiado de stackoverflow.com/a/5195913/4130619
reduzindo a atividade

Acho que a outra resposta, stackoverflow.com/a/16164809/11635 deve ser aceita. Mesmo se não, ele deve definitivamente ser lido - fornece prós e contras e, finalmente, uma resposta mais prática e correta para hoje #
Ruben Bartelink

138

Na configuração remota padrão do git, você precisa enviar tags explicitamente (enquanto elas são buscadas automaticamente junto com as confirmações para as quais apontam). Você precisa usar

$ git push <remote> tag <tagname>

empurrar uma única tag ou

$ git push <remote> --tags

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

Esse é um comportamento muito pretendido, para tornar explícitas as tags de envio. Empurrar etiquetas deve ser geralmente uma escolha consciente.


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

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

  1. o conjunto de tags que existe, tudo o que o editor deseja que as pessoas vejam e
  2. não apenas você, mas outras pessoas também verão as mesmas tags.

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

É por isso que git fetch"segue" automaticamente as tags, ou seja, ele baixa as tags ao baixar as revisões para as quais elas apontam - em outras palavras, baixa todas as tags publicadas relevantes .

Ao empurrar, você está empurrando do seu repositório de trabalho, que na maioria das vezes não é público, e as tags nesse repositório não foram projetadas para serem públicas. Você pode usar suas próprias tags locais para marcar seu progresso, portanto, não faz sentido enviar todas as tags cegamente em seu repositório para o repositório que você está pressionando para publicar suas alterações, cujas tags são por definição públicas.

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


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

[remota "publicação"] # ou o que quer que seja chamado
    url = ...
    push = + refs / cabeças / *: refs / cabeças / *
    push = + refs / tags / *: refs / tags / *

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


Isso não faz sempre um 'empurrão forçado' de todas as cabeças?
Stefan Näwe

@ Stefan: Sim, sim. Atualizada.
Jakub Narębski

19
"Esse é um comportamento muito pretendido, para tornar explícitas as tags de envio. As tags de envio geralmente devem ser uma escolha consciente." Eu não entendo a lógica. Você pode explicar por que seria ruim para o Git enviar tags automaticamente?
Ryan Lundy

13
@Kyralessa, neste post git.661346.n2.nabble.com/… , Junio ​​C Hamano (atual mantenedor do Git) explica por que é uma coisa ruim empurrar tags automaticamente.
Andre Miras 10/09

@AndreMiras Obrigado por este link incrível. Seria bom se pudéssemos integrar a postagem de Junio ​​nessa resposta.
Homer6

67

Observe que desde o git 1.8.3 (22 de abril de 2013) , você não precisa mais executar 2 comandos para enviar ramificações e depois enviar tags:

A nova --follow-tagsopção " " indica " git push" para enviar tags anotadas relevantes ao empurrar ramificações .

Agora você pode tentar, ao enviar novas confirmações:

git push --follow-tags

Porém, isso não enviará todas as tags locais, apenas as anotadas referenciadas por confirmações que são enviadas por push com git push.


Isso 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 ausentes do outro lado e que podem ser acessadas pelo histórico que, de outra forma, é enviado.

Por exemplo, se você estiver usando o push " simple", " current" ou " upstream", normalmente enviará o histórico que leva ao commit no seu atual HEADe nada mais.
Com esta opção, você também enviaria todas as tags anotadas que podem ser acessadas dessa confirmação para o outro lado.


A configuração push.followTagspermite incluir --follow-tagspor padrão (Git 2.4.1+, Q2 2015). Consulte " Push git confirma e identifica simultaneamente "


3
Isso empurra apenas todas as tags anotadas . A maioria das pessoas / projetos está usando tags leves . Assim, na maioria dos casos git push --follow-tagsnão empurrar mais do quegit push
Jarl

3
@ Jarl sim, eu mencionei "anotado" na minha resposta. Mas eu realmente só usei tags anotadas, reservando tags leves para uso puramente interno (ou seja, nunca pretendi ser pressionado de qualquer maneira).
VonC

@VonC: Agora há também uma opção de configuração que torna este o padrão, como você observou aqui: stackoverflow.com/a/3745250/946850
krlmlr

19

O que eu costumo fazer é:

[remota "publicação"] # ou o que quer que seja chamado
    url = ...
    push =:
    push = + refs / tags / *: refs / tags / *

Isso significa que empurra todos os ramos que já estão lá, além de tags. Ele não força o push e não empurra o ramo que você não empurrou manualmente.


Também posso colocar isso na configuração global do git do meu usuário? Se sim, como? Obrigado! :)
gucki

Parece que você está forçando as tags, mas não os ramos.
Adrian Ratnapala

Bem, sim, e não, eu escrevi isso, ele empurrará novas tags, não forçará a empurrá-las, e não empurrará os ramos que você ainda não empurrou.
mat

Tentei a sugestão de Jakub, mas estava empurrando galhos que só queria localmente. Essa sugestão, tapete, funciona perfeitamente. Ele sincroniza tags, mas não sincroniza ramificações, a menos que sejam ramificações de rastreamento remoto (ou seja, não enviará novas ramificações para o controle remoto, mas as atualizará se já estiverem no controle remoto). NOTA: se você tiver uma tag e uma ramificação com o mesmo nome, receberá o erro "corresponde a mais de um". Consulte lostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/ .
josephdpurcell

5

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

git config remote.origin.tagopt --tags

Dos documentos:

Definir esse valor como --no-tags desativa a marcação automática a seguir ao buscar no controle remoto. Configurá-lo como --tags buscará todas as tags do controle remoto, mesmo que elas não sejam alcançáveis ​​a partir dos cabeçotes remotos. Passar esses sinalizadores diretamente para o git-fetch (1) pode substituir essa configuração. Veja as opções --tags e --no-tags do git-fetch (1).


1
A pergunta foi mais orientada para "empurrar". Sua resposta também se aplica ao empurrar para um controle remoto?
a1an 23/09/15
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.