Anche i tag git vengono spinti?


190

Da quando ho creato il mio repository sembra che i tag che ho creato non vengano inviati al repository. Quando lo faccio git tagnella directory locale sono presenti tutti i tag, ma quando accedo al repository remoto e faccio un git tag, solo i primi vengono visualizzati.

Quale potrebbe essere il problema?


3
git push --follow-tagsora può essere utile, vedi la mia risposta di seguito
VonC


1
Concordo con il duplicato: sebbene questo sia più vecchio, l'altra domanda è meglio posta.
Ciro Santilli 18 冠状 病 六四 事件 法轮功

Risposte:


247

Potresti farlo:

git push --tags

27
Sono abbastanza sicuro che ciò significhi che i riferimenti HEAD non verranno spinti, il che significa che SOLO spingi i tag.
Dan Rosenstark,

47
"Raccomando di non usare o addestrare gli altri a usarlo git push --tagspoiché può essere molto difficile sbarazzarsi di tag errati quando i tuoi colleghi sono addestrati a spingere tutti i tag, poiché le persone continuano a spingere i vecchi tag nocivi che hanno localmente ogni volta che desidera inserire un nuovo tag. Per questo motivo, consiglio a tutti solo di utilizzare qualcuno git push origin <tag_name>adesso. " - copiato da stackoverflow.com/a/5195913/4130619
riduzione dell'attività

Penso che l'altra risposta, stackoverflow.com/a/16164809/11635 dovrebbe essere accettata. Anche se no, dovrebbe assolutamente essere letto - fornisce pro e contro e, in definitiva, una risposta più pratica e corretta per oggi
Ruben Bartelink,

140

Nella configurazione di default di git remote devi inviare esplicitamente i tag (mentre vengono recuperati automaticamente insieme agli commit a cui puntano). Devi usare

$ git push <remote> tag <tagname>

per inviare un singolo tag o

$ git push <remote> --tags

per inviare tutti i tag (o git push --tagsper passare al telecomando predefinito, in genere origin).

Questo è un comportamento molto previsto, per rendere espliciti i tag push. Spingere i tag dovrebbe essere di solito una scelta consapevole.


Riassumendo ciò che ha scritto Junio ​​C. Hamano (collegato nei commenti di @Andre Miras)

Durante il recupero, stai interagendo con un repository remoto che qualcuno ha pubblicato, il che significa:

  1. l'insieme di tag esistenti ci sono tutti i publisher che la gente voleva che vedessero e
  2. non solo tu ma altre persone vedrai anche gli stessi tag.

In altre parole, i tag nei repository da cui prendi sono progettati per essere pubblici e condivisi. Faciliterà la comunicazione tra gli sviluppatori se è facile per tutti recuperare questi stessi tag.

Ecco perché git fetch"segue" automaticamente i tag, ovvero scarica i tag durante il download delle revisioni a cui puntano, ovvero scarica tutti i tag pubblicati pertinenti .

Quando si spinge, si sta spingendo dal proprio repository di lavoro, che la maggior parte delle volte non è pubblico, e i tag in quel repository non sono progettati per essere pubblici. Puoi utilizzare i tuoi tag locali per contrassegnare i tuoi progressi, quindi non ha senso spingere alla cieca tutti i tag nel tuo repository nel repository che stai spingendo per pubblicare le modifiche, i cui tag sono per definizione pubblici.

Ecco perché è necessario inviare il tag in modo esplicito, per contrassegnare il tag come pubblico.


In alternativa puoi configurare il telecomando su cui premi per inviare sempre tutti i tag, ad esempio inserendo qualcosa del genere nel tuo .git/config:

[remote "publishing"] # o come si chiama
    url = ...
    push = + refs / heads / *: refs / heads / *
    push = + refs / tags / *: refs / tags / *

Questo significa forzare il push di tutte le teste (tutti i rami) e tutti i tag (se non si desidera forzare il push delle teste, rimuovere il prefisso '+' da refspec).


Questo non fa sempre una "spinta forzata" di tutte le teste?
Stefan Näwe,

@Stefan: Sì, lo fa. Aggiornato.
Jakub Narębski,

19
"Questo è un comportamento molto intenzionale, per rendere esplicito il push dei tag. Il push dei tag dovrebbe essere di solito una scelta consapevole." Non capisco la logica. Puoi spiegare perché sarebbe male per Git spingere i tag automaticamente?
Ryan Lundy,

13
@Kyralessa, in questo post git.661346.n2.nabble.com/… , Junio ​​C Hamano (attuale manutentore di Git) spiega perché è brutto inviare tag automaticamente.
Andre Miras,

@AndreMiras Grazie per questo fantastico link. Sarebbe bello se potessimo integrare il post di Junio ​​in questa risposta.
Homer6

67

Si noti che 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 quelli annotati a cui fanno riferimento i commit che vengono inseriti con git push.


Questo è stato introdotto in commit c2aba15 da Junio ​​C Hamano ( gitster) :

La nuova opzione " --follow-tags" dice " git push" di inviare tag annotati che mancano dall'altro lato e che possono essere raggiunti dalla cronologia che altrimenti viene espulsa.

Ad esempio, se si utilizza il " simple", " current" o " upstream" push, normalmente si spingerebbe la cronologia che porta al commit al proprio attuale HEADe nient'altro.
Con questa opzione, spingeresti anche tutti i tag annotati che possono essere raggiunti da quel commit sull'altro lato.


La configurazione push.followTagsconsente di includere --follow-tagsper impostazione predefinita (Git 2.4.1+, Q2 2015). Vedi " Push git commit e tag contemporaneamente "


3
Questo spinge solo tutti i tag annotati . Molte persone / progetti utilizzano tag leggeri . Quindi nella maggior parte dei casi git push --follow-tagsnon spinge più digit push
Jarl

3
@Jarl sì, ho menzionato "annotato" nella mia risposta. Ma ho usato solo tag con annotazioni, riservando tag leggeri per un uso puramente interno (cioè non ho mai pensato di essere spinto comunque).
VonC,

@VonC: Ora c'è anche un'opzione di configurazione che rende questo il default, come avrete notato qui: stackoverflow.com/a/3745250/946850
krlmlr

19

Quello che faccio di solito è:

[remote "publishing"] # o come si chiama
    url = ...
    push =:
    push = + refs / tags / *: refs / tags / *

Significa che spinge ogni ramo che è già lì, oltre a tag. Non forza la spinta e non spinge il ramo che non hai spinto manualmente.


Posso anche inserirlo nella configurazione globale del mio utente? Se si, come? Grazie! :)
gucki,

Sembra che tu stia forzando i tag, ma non i rami.
Adrian Ratnapala,

Bene, sì, e no, l'ho scritto, spingerà nuovi tag, non forzerà a spingerli e non spingerà rami che non hai già spinto da solo.
mat

Ho provato il suggerimento di Jakub, ma stava spingendo i rami che volevo solo localmente. Questo suggerimento, opaco, funziona perfettamente. Sincronizza i tag ma non sincronizza i rami a meno che non siano rami di tracciamento remoti (ovvero non spingerà i nuovi rami sul telecomando, ma li aggiornerà se sono già nel telecomando). NOTA: se si dispone di un tag e un ramo con lo stesso nome, viene visualizzato l'errore "corrisponde a più di un". Fare riferimento a lostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/ .
josephdpurcell,

5

E se vuoi forzare il recupero di tutti i tag, puoi impostarlo nella configurazione da:

git config remote.origin.tagopt --tags

Dai documenti:

Impostando questo valore su --no-tags si disabilita la seguente funzione di tag automatica durante il recupero da remoto. Impostandolo su --tags verranno recuperati tutti i tag dal remoto, anche se non sono raggiungibili dalle teste di diramazione remote. Passare questi flag direttamente a git-fetch (1) può sovrascrivere questa impostazione. Vedi le opzioni --tags e --no-tags di git-fetch (1).


1
La domanda era più "push", la tua risposta si applica anche quando si spinge verso un telecomando?
a1
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.