Como você envia uma tag Git para uma ramificação usando um refspec?

216

Quero forçar o envio, por exemplo, da minha tag 1.0.0para minha masterramificação remota .

Agora estou fazendo o seguinte:

git push production +1.0.0:master

Quero forçar o envio , porque tudo o que me interessa é que o código dentro da1.0.0tag seja enviado para omasterramo no repositório remoto.

O que estou fazendo de errado?

Atualização # 1

Quando eu SSH no meu servidor onde meu repositório Git está e executo git branch -l, também não vejo a masterramificação listada.

Atualização # 2

Depois de executar git tag -lde dentro do repositório Git remoto, vejo que masterestá listado, o que significa que, quando executei o seguinte:

git push production 1.0.0:master

Na verdade, ele empurrou a tag e criou uma tag nomeada em master vez de uma nova ramificação .

Quero basicamente enviar o conteúdo da tag 1.0.0para o masterramo do repositório Git remoto.

Michael van Rooijen
fonte
Você pode esclarecer o que significa "não está funcionando"? O Git fornece um erro específico ou tem um efeito nulo?
Vcsjones 31/10/10
Eu sinto Muito. Sim, basicamente, quando eu faço o SSH no meu servidor, no repositório git e execute o git branch -l para listar os branches, só vejo meu outro branch. No entanto, a produção do git push +1.0.0: master fez o push, e quando eu o pressiono novamente, diz Tudo atualizado , mas não vejo a ramificação principal no servidor remoto.
Michael van Rooijen 31/10/10
5
Você deve alterar a resposta aceita. A segunda resposta é muito mais simples que a que está marcada como aceita.
Pedro Rolo
Desculpe pela resposta tardia. Concordo e agora alterei a resposta aceita.
Michael van Rooijen
1
@MichaelvanRooijen Não entendo como a resposta aceita que você escolheu realmente resolve esse problema. Ele não substitui um ramo com uma tag, apenas envia suas tags para o controle remoto.

Respostas:

61

Provavelmente está falhando porque 1.0.0é uma tag anotada. Talvez você tenha visto a seguinte mensagem de erro:

error: Tentando gravar um objeto não confirmado na ramificação refs / heads / master

Tags anotadas têm seu próprio tipo distinto de objeto que aponta para o objeto de confirmação marcado. As ramificações não podem apontar utilmente para marcar objetos, apenas confirmar objetos. Você precisa "descascar" a tag anotada de volta para confirmar o objeto e enviar por push.

git push production +1.0.0^{commit}:master
git push production +1.0.0~0:master          # shorthand

Há outra sintaxe que também funcionaria nesse caso, mas significa algo ligeiramente diferente se o objeto de tag apontar para algo diferente de um commit (ou um objeto de tag que aponte para (um objeto de tag que aponte para ...) um commit) .

git push production +1.0.0^{}:master

Essas sintaxes de descascamento de tags são descritas em git-rev-parse (1) em Especificando revisões .

Chris Johnsen
fonte
1
Isso resolveu o problema! No entanto, o ramo mestre já precisa existir. Este não é um problema do meu lado, no entanto. Muito obrigado por sua ajuda!
Michael van Rooijen 31/10/10
2
@ Michael: Ahh. Sim, se o mestre não existir (como um ramo ou uma marca), git push rep +tag:mastercriará uma marca chamada mestre em vez de um ramo. git push rep +tag~0:master(novamente, quando o mestre não existir como filial ou tag) falhará com "erro: não é possível enviar para o destino não qualificado". O comando que teria feito o que você queria (antes de qualquer mestre ramo / etiqueta existiu) é git push rep +tag~0:refs/heads/master( refs/heads/é o namespace em que ramos são armazenados).
quer
ÓTIMO! Isso vai me ajudar incrivelmente bem. Muito conveniente! Muito obrigado por postar essas informações também.
Michael van Rooijen 31/10/10
4
@ brad: A ~{commit}sintaxe é literal (ou seja, sempre esses nove caracteres); a palavra commitnão é um espaço reservado aqui.
Chris Johnsen
1
Ah ok! desculpe, eu estava pensando que você pretendia inserir um commit específico, agora faz mais sentido.
21411 brad
469
git push --tags production
bstpierre
fonte
4
Se a etiqueta já existir no controle remoto, você deverá primeiro excluir a etiqueta remota git push production :1.0.0.
respectTheCode
1
Se por qualquer motivo você terá ramo com mesmo nome: '1.0.0' este impulso falhará assim uma melhor utilização: git push production :refs/tags/1.0.0a tag de exclusão única
Vladimir
1
@Nerian: Eu acho que ele só empurra marcas
bstpierre
5
Como isso realmente resolve o problema do pôster original sobre a substituição de uma ramificação por uma tag pressionando-a com força? Isso apenas envia todas as suas tags para um controle remoto, não sobrescreve nenhuma ramificação.
1
Não é a pergunta perguntando como empurrar uma tag? Este comando faz muito mais do que isso.
Chris Martin
61

Eu crio a tag assim e depois a envio ao GitHub:

git tag -a v1.1 -m "Version 1.1 is waiting for review"
git push --tags

Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1
neoneye
fonte
4
que empurrar todas as suas tags
Dawid Drozd
2
Observe que isso realmente não resolverá o problema do pôster original sobre a substituição de uma ramificação por uma tag, apenas enviará suas tags para um controle remoto, sem afetar as ramificações.
10

Para enviar uma única tag: git push <reponame> <tagname>

Por exemplo git push production 1.0.0,. Tags não estão vinculadas a ramificações, elas são vinculadas a confirmações.

Quando você quiser ter o conteúdo da tag na ramificação principal, faça-o localmente em sua máquina. Eu diria que você continuou desenvolvendo em seu ramo mestre local. Então apenas um git push origin masterdeve ser suficiente.

koppor
fonte
5
Observe que isso realmente não resolverá o problema do pôster original sobre a substituição de uma ramificação por uma tag, apenas enviará suas tags para um controle remoto, sem afetar as ramificações.