2010-03-28 10 views

risposta

8

In git, un tag "normale" (annotato, non leggero) è un oggetto a sé stante, contenente metadati e SHA1 dell'oggetto che codifica. C'è una bella immagine nella sezione del libro della community git su the git object model (scorri verso il basso).

Quindi, quando si utilizza show-ref su un tag normale, normalmente fornirà informazioni sull'oggetto tag. Con l'opzione -d/--dereference, il riferimento verrà trasferito nell'oggetto a cui fa riferimento il tag e verranno fornite invece informazioni.

E una nota sulla leggeri contro annotato tag, nel caso in cui non si è consapevoli di questo: un tag leggero viene creato utilizzando git tag <tag name> (cioè senza una delle opzioni di metadati-fornendo come -a, -s, o -u) . Non è affatto un oggetto tag, solo un riferimento diretto all'oggetto che hai taggato. Se fornisci una di queste opzioni, stai allegando i metadati al tag, quindi git crea un oggetto tag per mantenerlo.

+0

Buon riassunto. + 1 Vedi anche http://stackoverflow.com/questions/1194385/seeing-what-revision-goes-with-a-tag-in-git: "se non sai/cura se il tag è un oggetto tag o un'etichetta leggera, ma vuoi vedere solo il commit puoi usare 'git show v1.5.0^{}', o 'git rev-parse v1.5.0^{}' per un modo scriptable da recuperare l'ID commit. " – VonC

+0

Il suggerimento utile di VonC probabilmente sembra un po 'strano per chiunque non sia molto familiare con git. Il suffisso '^ {}' è una notazione speciale per i tag; significa "dereferenziare il tag ripetutamente finché non trovi qualcosa oltre a un tag" - nel caso in cui hai fatto qualcosa di pazzo come taggare un tag con un tag. – Cascabel

+0

true, la notazione è dispari;) Per quanto riguarda il tagging di un tag con un tag, si può immaginare che potrebbe aiutare ad aggiungere qualche tipo di metadati (come ad esempio un "livello di promozione" "rifiutato", "testato", "rilasciato" , ...) a un commit con tag esistente. – VonC

Problemi correlati