Come si invia un tag Git a un ramo utilizzando un refspec?


217

Voglio forzare il push, ad esempio, il mio tag 1.0.0al mio masterramo remoto .

Ora sto facendo quanto segue:

git push production +1.0.0:master

Voglio forzare il push , perché tutto quello che mi interessa è che il codice all'interno del1.0.0tag venga inviato almasterramo del repository remoto.

Che cosa sto facendo di sbagliato?

Aggiorna # 1

Quando eseguo SSH nel mio server dove si trova il mio repository Git ed eseguo git branch -l, non vedo nemmeno il masterramo elencato.

Aggiorna n. 2

Dopo aver eseguito git tag -ldall'interno del repository Git remoto, vedo che masterè elencato, il che significa che quando ho eseguito quanto segue:

git push production 1.0.0:master

In realtà ha spinto il tag e ha creato un tag denominato master piuttosto che un nuovo ramo .

Voglio fondamentalmente spingere il contenuto del tag 1.0.0nel masterramo del repository Git remoto.


Puoi chiarire cosa significa "non funzionante"? Git fornisce un errore specifico o ha un effetto nullo?
vcsjones

Mi dispiace. Sì, quindi fondamentalmente quando eseguo SSH nel mio server, nel repository git ed eseguo git branch -l per elencare i rami, vedo solo l'altro mio ramo. Tuttavia, il git push production +1.0.0: master ha fatto push, e quando re-push si dice Tutto aggiornato , ma non vedo il ramo master sul server remoto.
Michael van Rooijen

5
Dovresti cambiare la risposta accettata. La seconda risposta è molto più semplice di quella contrassegnata come accettata.
Pedro Rolo

Scusa per la risposta in ritardo. Sono d'accordo e ora ho cambiato la risposta accettata.
Michael van Rooijen

1
@MichaelvanRooijen Non capisco come la risposta accettata che hai scelto risolva effettivamente questo problema. Non sovrascrive un ramo con un tag, spinge semplicemente i tuoi tag sul telecomando.

Risposte:


62

Probabilmente non funziona perché 1.0.0è un tag annotato. Forse hai visto il seguente messaggio di errore:

errore: si sta tentando di scrivere un oggetto senza commit nel ramo refs / heads / master

I tag annotati hanno il loro tipo distinto di oggetto che punta all'oggetto di commit con tag. I rami non possono puntare utilmente a tag oggetti, ma solo commit di oggetti. È necessario "staccare" il tag annotato per eseguire il commit dell'oggetto e spingerlo invece.

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

C'è un'altra sintassi che funzionerebbe anche in questo caso, ma significa qualcosa di leggermente diverso se l'oggetto tag punta a qualcosa di diverso da un commit (o un oggetto tag che punta a (un oggetto tag che punta a ...) un commit) .

git push production +1.0.0^{}:master

Queste sintassi di peeling dei tag sono descritte in git-rev-parse (1) in Specifying Revisions .


1
Questo ha risolto il problema! Tuttavia, il ramo principale deve già esistere. Tuttavia, questo non è un problema da parte mia. Grazie mille per il vostro aiuto!
Michael van Rooijen

2
@Michael: Ahh. Sì, se il master non esiste (come ramo o tag), git push rep +tag:mastercreerà un tag denominato master invece di un ramo. git push rep +tag~0:master(di nuovo, quando il master non esiste come ramo o tag) fallirà con "errore: impossibile eseguire il push a una destinazione non qualificata". Il comando che avrebbe fatto quello che voleva (prima di ogni maestro ramo / tag esistito) è git push rep +tag~0:refs/heads/master( refs/heads/è lo spazio dei nomi in cui sono memorizzati i rami).
Chris Johnsen

GRANDE! Questo mi aiuterà incredibilmente bene. Molto conveniente! Grazie mille anche per aver pubblicato queste informazioni.
Michael van Rooijen

4
@brad: la ~{commit}sintassi è letterale (cioè sempre quei nove caratteri); la parola commitnon è un segnaposto qui.
Chris Johnsen

1
Ah ok! scusa, stavo pensando che volevi inserire il commit particolare, ora ha più senso.
brad

468
git push --tags production

4
Se il tag esiste già sul telecomando, sarà necessario eliminare prima il tag remoto con git push production :1.0.0.
rispetta il codice

1
Se per qualche occasione avrai un ramo con lo stesso nome: '1.0.0' questa operazione non andrà a buon fine, quindi usa meglio: git push production :refs/tags/1.0.0per eliminare solo il tag
Vladimir

1
@ Nerian: Penso che spinga solo i tag
bstpierre

6
In che modo questo risolve effettivamente il problema del poster originale relativo alla sovrascrittura di un ramo con un tag spingendolo con forza? Questo spinge solo tutti i tuoi tag su un telecomando, non sovrascriverà alcun ramo.

1
Non è la domanda che chiede come spingere un tag? Questo comando fa molto di più.
Chris Martin,

61

Creo il tag in questo modo e poi lo metto su 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 git@github.com:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1

4
spinge tutti i tuoi tag
Dawid Drozd

2
Nota che questo in realtà non risolverà il problema del poster originale relativo alla sovrascrittura di un ramo con un tag, ma invierà semplicemente i tuoi tag a un telecomando, senza influenzare i rami.

10

Per spingere un singolo tag: git push <reponame> <tagname>

Per esempio, git push production 1.0.0. I tag non sono vincolati ai rami, sono vincolati ai commit.

Quando vuoi avere il contenuto del tag nel ramo master, fallo localmente sulla tua macchina. Presumo che tu abbia continuato a sviluppare nel tuo ramo principale locale. Quindi solo un git push origin masterdovrebbe essere sufficiente.


5
Nota che questo in realtà non risolverà il problema del poster originale relativo alla sovrascrittura di un ramo con un tag, ma invierà semplicemente i tuoi tag a un telecomando, senza influenzare i rami.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.