Push git confirma e identifica simultaneamente

387

Estou ciente da razão de git push --tagsser uma operação separada para a idade antiga git push. Enviar etiquetas por push deve ser uma escolha consciente, pois você não deseja enviar acidentalmente uma. Isso é bom. Mas existe uma maneira de unir os dois? (Além de git push && git push --tags.)

Will Robertson
fonte
4
Qual é o seu problema git push && git push --tags?
fuz 19/09/10
21
Nada em particular, é apenas mais lento, pois a conexão deve ser estabelecida duas vezes.
Will Robertson
16
Veja a minha resposta atualizada abaixo: há uma nova --follow-tagsopção, uma vez git 1.8.3
VonC
24
Outro motivo para não fazer isso separadamente, é evitar o acionamento de duas construções de IC para o mesmo commit, quando você tiver esse tipo de automação.
Alex R
Também --tagsnão faz distinção entre marcas leves e anotados fonte
karlsebal

Respostas:

555

Atualização de maio de 2015

No git 2.4.1 , você pode fazer

git config --global push.followTags true

Se definido como true, ative a opção --follow-tags por padrão.
Você pode substituir essa configuração no momento do envio, especificando --no-follow-tags.

Conforme observado neste tópico por Matt Rogers, respondendo a Wes Hurd :

--follow-tags empurra apenas tags anotadas .

git tag -a -m "I'm an annotation" <tagname>

Isso seria enviado (ao contrário de git tag <tagname>uma tag leve, que não seria enviada, como eu mencionei aqui )

Atualização de abril de 2013

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 a referenciada por confirmações que são enviadas com o git push.

O Git 2.4.1+ (Q2 2015) apresentará a opção push.followTags: consulte " Como fazer" git push"incluir tags em uma ramificação? ".

Resposta original, setembro de 2010

A opção nuclear seria git push --mirror, o que empurrará todos os árbitros para baixo refs/.

Você também pode enviar apenas uma tag com seu commit de ramificação atual:

git push origin : v1.0.0 

Você pode combinar a --tagsopção com um refspec como:

git push origin --tags :

(uma vez que --tagssignifica: Todas as referências abaixo refs/tagssão enviadas por push , além das referências especificadas explicitamente na linha de comando )


Você também tem esta entrada " Empurrando ramificações e tags com uma única invocação " git push "

Uma dica útil foi postada na lista de discussão do Git por Zoltán Füzesi:

Eu uso .git/configpara resolver isso:

[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
    push = +refs/heads/*
    push = +refs/tags/*

Com essas linhas adicionadas, você git push originfará o upload de todos os seus ramos e tags. Se você deseja carregar apenas alguns deles, pode enumerá-los.

Ainda não tentei, mas parece que pode ser útil até que outra maneira de enviar ramos e tags ao mesmo tempo seja adicionada ao git push.
Por outro lado, não me importo de digitar:

$ git push && git push --tags

Cuidado , como comentado por Aseem Kishore

push = +refs/heads/*vai forçar-empurra todos os seus ramos .

Isso me mordeu agora, então, para sua informação.


René Scheibe acrescenta este comentário interessante :

O --follow-tagsparâmetro é enganoso, pois apenas as tags abaixo .git/refs/tagssão consideradas.
Se git gcfor executado, as tags serão movidas de .git/refs/tagspara .git/packed-refs. Depois disso git push --follow-tags ..., não funciona mais como o esperado.

VonC
fonte
3
O único comentário na postagem ao qual você vincula indica corretamente que a push = +refs/heads/*linha force- empurra todos os seus ramos. Isso me mordeu agora, então, para sua informação.
Aseem Kishore
2
Re: o --follow-tagssinalizador adicionado no git 1.8.3, posso configurar minha instalação do git para tornar o padrão?
Trevor Burnham
11
@TrevorBurnham não, somente o valor do push.default( git-scm.com/docs/git-config ) pode definir ações padrão de push ( nothing, matching, upstream, simplecomo em stackoverflow.com/a/10002469/6309 ). Você precisa adicionar --follow-tagexplicitamente.
VonC
11
@VonC E se eu quiser forçar o push da tag? git push --follow-tags -fnão funcionou para mim.
mauryat
11
O --follow-tagsparâmetro é enganoso, pois apenas as tags abaixo .git/refs/tagssão consideradas. Se git gcfor executado, as tags serão movidas de .git/refs/tagspara .git/packed-refs. Depois disso git push --follow-tags ..., não funciona mais como o esperado.
René Scheibe
4

Talvez isso ajude alguém:

 1. git commit -a -m "msg"  
 2. git tag 0.1.0                // creates a new tag locally     
 3. git push origin tag 0.1.0    // pushes the tag & the code in the remote repo          
Rajesh Gupta
fonte
Eu tentei sua solução com git-2.21.0.windows.1 e descobriu que 3 só empurra tag
Dustin Sun
Está funcionando bem no meu final. Você está tentando todos os 3 comandos na ordem correta e o repositório remoto está definido (git remote -v)?
Rajesh Gupta
Eu usei o "git commit -m 'msg' na etapa 1 e não havia parâmetro -a Isto poderia ser por isso que Obrigado pelo acompanhamento..!
Dustin Sun
2

@since Git 2.4

git push --atomic origin <branch name> <tag>

SoBeRich
fonte
0

GUI do Git

A GUI do Git tem um botão PUSH - perdoe o trocadilho e a caixa de diálogo que ele abre possui uma caixa de seleção para tags.

Empurrei uma ramificação na linha de comando, sem tags, e tentei novamente empurrar a ramificação usando o --follow-tags opção descrita acima. A opção é descrita como as seguintes tags anotadas. Minhas tags eram simples.

Eu consertei algo, marquei o commit com a correção (para que os colegas possam escolher a correção), depois mudei o número da versão do software e marquei o release que eu criei (para que os colegas possam clonar esse release).

Git voltou dizendo que tudo estava atualizado. Não enviou as tags! Talvez porque as tags não foram anotadas. Talvez porque não havia nada de novo no ramo.

Quando fiz um push semelhante com a GUI do Git, as tags foram enviadas.

Tags enviadas com a GUI do Git

Por enquanto, pressionarei minhas alterações nos meus controles remotos com a GUI do Git e não com a linha de comando e --follow-tags.

Ivan
fonte