Qual è la differenza tra un tag annotato e non annotato?


333

Se voglio taggare il commit corrente. So che funzionano entrambe le seguenti righe di comando:

git tag <tagname>

e

git tag -a <tagname> -m '<message>'

Qual è la differenza tra questi comandi?



1
@Thilo Questo non è un duplicato esatto. La domanda referenziata riguarda quando annotare, non sui relativi flag.
Todd A. Jacobs,

1
Questo è molto ben spiegato nella documentazione di Git: git-scm.com/book/en/Git-Basics-Tagging
Samy Dindane,

TLDR non annotato: commit; annotato: commit, autore, data, commento (facoltativo)
Antony Hatchkins,

Risposte:


255

TL; DR

La differenza tra i comandi è che uno ti fornisce un messaggio tag mentre l'altro no. Un tag annotato ha un messaggio che può essere visualizzato con git-show (1), mentre un tag senza annotazioni è solo un puntatore denominato a un commit.

Maggiori informazioni sui tag leggeri

Secondo la documentazione : "Per creare un tag leggero, non fornire alcuna delle opzioni -a, -s o -m, basta fornire un nome tag". Esistono anche diverse opzioni per scrivere un messaggio su tag annotati:

  • Quando lo usi git tag <tagname>, Git creerà un tag nella revisione corrente ma non ti chiederà un'annotazione. Sarà taggato senza un messaggio (questo è un tag leggero).
  • Quando lo usi git tag -a <tagname>, Git ti chiederà un'annotazione a meno che tu non abbia anche usato il flag -m per fornire un messaggio.
  • Quando lo usi git tag -a -m <msg> <tagname>, Git taggerà il commit e lo annoterà con il messaggio fornito.
  • Quando si utilizza git tag -m <msg> <tagname>, Git si comporterà come se si passasse il flag -a per l'annotazione e si utilizzasse il messaggio fornito.

Fondamentalmente, ciò equivale semplicemente a desiderare che il tag abbia un'annotazione e alcune altre informazioni associate ad esso o meno.


4
C'è una differenza tra un tag "annotazione" e un messaggio di commit?
Steve Bennett,

3
@SteveBennett Sì. Un'annotazione di tag non è un messaggio di commit. Non puoi vederlo con git-log (1); devi usare git-show (1).
Todd A. Jacobs,

115
La differenza tra tag "annotati" e "leggeri" va oltre il messaggio. Puoi avere un tag annotato senza un messaggio ( git tag -a <tag> -m ''), ma un tag annotato ha sempre tagger (autore) e data .
Piotr Findeisen,

1
Stessa cosa per me. I tag di versione di solito hanno messaggi piuttosto inutili (può dire più del nome? A cosa serve?). Sfortunatamente, questa risposta più votata non menziona questa differenza.
Piotr Findeisen,

44
Un'altra cosa importante da notare è che quando si spostano i tag in un repository remoto utilizzando git push --follow-tags, verranno inviati solo i tag annotati.
Xatoo,

209

Spingi i tag con annotazioni, mantieni il locale leggero

man git-tag dice:

I tag con annotazioni sono pensati per il rilascio mentre i tag leggeri sono pensati per etichette di oggetti private o temporanee.

E alcuni comportamenti si differenziano tra loro in modo che questa raccomandazione sia utile, ad esempio:

  • i tag annotati possono contenere un messaggio, un creatore e una data diversi dal commit a cui puntano. Quindi potresti usarli per descrivere una versione senza effettuare un commit della versione.

    I tag leggeri non hanno queste informazioni extra e non ne hanno bisogno, poiché le utilizzerai solo per svilupparle.

  • git push --follow-tags invierà solo tag con annotazioni
  • git describe senza opzioni della riga di comando vede solo tag con annotazioni

Differenze interne

  • sia i tag leggeri che quelli con annotazioni sono un file .git/refs/tagscontenente un SHA-1

  • per tag leggeri, SHA-1 punta direttamente a un commit:

    git tag light
    cat .git/refs/tags/light
    

    stampa lo stesso di HEAD SHA-1.

    Quindi non c'è da stupirsi che non possano contenere altri metadati.

  • i tag annotati puntano a un oggetto tag nel database degli oggetti.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    contiene lo SHA dell'oggetto tag annotato:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    e quindi possiamo ottenere il suo contenuto con:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    uscita campione:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <your@mail.com> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    Ed è così che contiene metadati extra. Come possiamo vedere dall'output, i campi dei metadati sono:

    Un'analisi più dettagliata del formato è presente in: Qual è il formato di un oggetto tag git e come calcolare il suo SHA?

bonus

  • Determina se un tag è annotato:

    git cat-file -t tag
    

    Uscite

    • commit per leggerezza, poiché non esiste alcun oggetto tag, punta direttamente al commit
    • tag per annotato, poiché in questo caso è presente un oggetto tag
  • Elencare solo tag leggeri: come posso elencare tutti i tag leggeri?


1
Questo è molto più chiaro della risposta attualmente accettata. Grazie.
Reece il

43

La grande differenza è spiegata perfettamente qui .

Fondamentalmente, i tag leggeri sono solo indicatori di commit specifici. Non vengono salvate ulteriori informazioni ; d'altra parte, i tag annotati sono oggetti regolari , che hanno un autore e una data e possono essere riferiti perché hanno la propria chiave SHA.

Se sai chi ha taggato cosa e quando è rilevante per te, usa i tag annotati. Se vuoi solo taggare un punto specifico nel tuo sviluppo , indipendentemente da chi e quando lo ha fatto, i tag leggeri sono abbastanza buoni.

Normalmente dovresti scegliere tag con annotazioni, ma dipende davvero dal master Git del progetto.

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.