Push git commette e tag contemporaneamente


387

Sono a conoscenza del motivo che git push --tagsè un'operazione separata dalla semplice vecchia git push. Spingere i tag dovrebbe essere una scelta consapevole poiché non si desidera spingerne uno accidentalmente. Va bene. Ma c'è un modo per mettere insieme entrambi? (A parte git push && git push --tags.)


4
Qual è il tuo problema git push && git push --tags?
fuz,

21
Nulla in particolare, è solo più lento poiché la connessione deve essere stabilita due volte.
Will Robertson,

16
Vedi la mia risposta aggiornata di seguito: esiste una nuova --follow-tagsopzione da git 1.8.3
VonC

24
Un altro motivo per non eseguire queste operazioni separatamente è quello di evitare di attivare due build CI per lo stesso commit, quando si dispone di quel tipo di automazione.
Alex R

Inoltre --tagsnon fa distinzione tra i tag leggeri e annotati fonte
karlsebal

Risposte:


555

Aggiornamento maggio 2015

A partire da git 2.4.1 , puoi farlo

git config --global push.followTags true

Se impostato su true abilita l'opzione --follow-tags per impostazione predefinita.
Puoi ignorare questa configurazione al momento del push specificando --no-follow-tags.

Come notato in questo thread da Matt Rogers che risponde a Wes Hurd :

--follow-tags invia solo tag con annotazioni .

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

Quello verrebbe spinto (al contrario git tag <tagname>, un tag leggero, che non verrebbe spinto, come ho detto qui )

Aggiornamento aprile 2013

Da git 1.8.3 (22 aprile 2013) , non è più necessario eseguire 2 comandi per eseguire il push dei rami e quindi i tag :

La nuova " --follow-tags" opzione dice a " git push" di spingere i tag annotati rilevanti quando si estendono i rami .

Ora puoi provare, quando spingi nuovi commit:

git push --follow-tags

Tuttavia, ciò non invierà tutti i tag locali, ma solo quello a cui fanno riferimento i commit che vengono inseriti con git push.

Git 2.4.1+ (Q2 2015) introdurrà l'opzione push.followTags: vedi " Come fare" git push"includere tag all'interno di un ramo? ".

Risposta originale, settembre 2010

L'opzione nucleare sarebbe git push --mirror, che spingerà sotto tutti gli arbitri refs/.

Puoi anche inviare un solo tag con il commit del ramo corrente:

git push origin : v1.0.0 

È possibile combinare l' --tagsopzione con un refspec come:

git push origin --tags :

(poiché --tagssignifica: refs/tagsvengono inseriti tutti i ref sottostanti , oltre ai refspec esplicitamente elencati nella riga di comando )


Hai anche questa voce " Push di rami e tag con un'unica invocazione " git push "

Un pratico suggerimento è stato appena pubblicato nella mailing list di Git da Zoltán Füzesi:

Uso .git/configper risolvere questo:

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

Con queste righe aggiunte git push originverranno caricati tutti i tuoi rami e tag. Se vuoi caricarne solo alcuni, puoi elencarli.

Non l'ho ancora provato da solo, ma sembra che potrebbe essere utile fino a quando non viene aggiunto un altro modo per spingere rami e tag allo stesso tempo a git push.
D'altra parte, non mi dispiace scrivere:

$ git push && git push --tags

Attenzione , come commentato da Aseem Kishore

push = +refs/heads/*spingerà forzatamente tutti i tuoi rami .

Questo mi ha morso solo ora, quindi FYI.


René Scheibe aggiunge questo interessante commento :

Il --follow-tagsparametro è fuorviante in quanto .git/refs/tagsvengono considerati solo i tag sottostanti .
Se git gcviene eseguito, i tag vengono spostati da .git/refs/tagsa .git/packed-refs. Successivamente git push --follow-tags ...non funziona più come previsto.


3
L'unico commento sul post a cui ti colleghi indica correttamente che la forza della push = +refs/heads/*linea spinge tutti i tuoi rami. Questo mi ha morso solo ora, quindi FYI.
Aseem Kishore,

2
Ri: il --follow-tagsflag aggiunto in git 1.8.3, posso configurare la mia installazione di git per renderla quella predefinita?
Trevor Burnham,

1
@TrevorBurnham no, solo il valore di push.default( git-scm.com/docs/git-config ) può definire azioni predefinite spinta ( nothing, matching, upstream, simplecome in stackoverflow.com/a/10002469/6309 ). Devi aggiungere --follow-tagesplicitamente.
VonC,

1
@VonC E se volessi forzare il push del tag? git push --follow-tags -fnon ha funzionato per me.
Mauryat,

1
Il --follow-tagsparametro è fuorviante in quanto .git/refs/tagsvengono considerati solo i tag sottostanti . Se git gcviene eseguito, i tag vengono spostati da .git/refs/tagsa .git/packed-refs. Successivamente git push --follow-tags ...non funziona più come previsto.
René Scheibe,

4

Forse questo aiuta qualcuno:

 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          

Ho provato la tua soluzione con git-2.21.0.windows.1 e ho scoperto che 3 spinge solo tag
Dustin Sun,

Funziona bene alla mia fine. Stai provando tutti e 3 i comandi nell'ordine giusto e il repository remoto è impostato (git remote -v)?
Rajesh Gupta,

Ho usato "git commit -m" msg "nel passaggio 1 e non c'era un parametro -a. Questo potrebbe essere il motivo. Grazie per il follow-up!
Dustin Sun

2

@since Git 2.4

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


0

Git GUI

Git GUI ha un pulsante PUSH: scusate il gioco di parole e la finestra di dialogo che apre ha una casella di controllo per i tag.

Ho spinto un ramo dalla riga di comando, senza tag, e quindi ho provato di nuovo a spingere il ramo usando l' --follow-tagsopzione descritta sopra. L'opzione è descritta come i seguenti tag annotati. I miei tag erano semplici tag.

Avevo risolto qualcosa, taggato il commit con la correzione in, (così i colleghi possono scegliere la correzione), quindi ho cambiato il numero di versione del software e taggato la versione che ho creato (così i colleghi possono clonare quella versione).

Git tornò dicendo che tutto era aggiornato. Non ha inviato i tag! Forse perché i tag non sono stati annotati. Forse perché non c'era nulla di nuovo sul ramo.

Quando ho fatto una spinta simile con Git GUI, i tag sono stati inviati.

Tag inviati con Git GUI

Per ora, invierò le mie modifiche ai telecomandi con la GUI di Git e non con la riga di comando e --follow-tags.

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.