Come dire a quale commit punta un tag in Git?


411

Ho un sacco di tag non annotati nel repository e voglio capire a quale commit fanno riferimento. Esiste un comando che elencherà solo i tag e i loro SHA di commit? Controllare il tag e guardare HEAD mi sembra un po 'troppo laborioso.

Aggiornare

Mi sono reso conto dopo aver esaminato le risposte che quello che volevo veramente era semplicemente guardare la storia che portava al tag, per cui git log <tagname>è sufficiente.

La risposta contrassegnata come risposta è utile per ottenere un elenco di tag e relativi commit, che è quello che ho chiesto. Con un po 'di hacker di shell sono sicuro che è possibile trasformarli in messaggio SHA + Commit.


3
Voglio sottolineare che git show-refmostra sha del tag, non sha della revisione del repository. $ git show-ref test 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / tags / test $ git checkout test HEAD è ora al c7f8831 ... $ git checkout 08b9c77 HEAD è ora al c7f8831 ...
Konstantin Pelepelin

se i tuoi tag sono annotati allora hai bisogno di--dereference
Trevor Boyd Smith

Risposte:


348

Un modo per farlo sarebbe con git rev-list. Di seguito verrà generato il commit a cui punta un tag:

$ git rev-list -n 1 $TAG

Puoi aggiungerlo come alias ~/.gitconfigse lo usi molto:

[alias]
  tagcommit = rev-list -n 1

E poi chiamalo con:

$ git tagcommit $TAG

30
Perché non usare git rev-parse <tag>? Oppure git rev-list -1 <tag>?
Jakub Narębski,

52
@ Jakub: git rev-parse $TAGrestituisce SHA1 dell'oggetto tag, non il commit a cui punta. git rev-list -1funziona, però.
mipadi,

11
@mipadi: per i tag non annotati non importa; per i tag annotati è possibile utilizzare git rev-parse $TAG^{commit}o git rev-parse $TAG^{}per determinare il tag annotato / firmato
Jakub Narębski

5
Puoi usare:git rev-list $TAG --max-count=1
b73,

4
@RobinHsu: se hai tag annotati , creati con git tag -ao git tag -s, allora git rev-parse <tag>ti darebbe SHA-1 di un oggetto tag stesso, mentre git rev-list -1 <tag>darebbe SHA-1 di commit (revisione) a cui punta, uguale a git rev-parse <tag>^{commit}. HTH.
Jakub Narębski,

240
git show-ref --tags

Ad esempio, git show-ref --abbrev=7 --tagsti mostrerà qualcosa di simile al seguente:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2

Grazie per questo, questo in realtà nasconde la semantica di guardare uno .git/packed-refso.git/refs/tags/*
Igor Zevaka,

3
hmmm. ha un comportamento strano nel mio repository: tag git -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; vedi la risposta di Jakub Narebski
NickSoft,

6
funziona, anche se mi chiedo che non abbia senso git tag --verbosemostrarlo anche tu ?
polarità

34
Questo mostrerà il riferimento del tag stesso, non il commit a cui punta il tag. È necessario aggiungere il -dflag per ottenere il commit di riferimento (su una seconda riga).
Vecchio professionista

4
@CharlesBailey, abbastanza equo, ma la domanda e le risposte si sono trasformate per includere tag con annotazioni e il fatto che git show-refsi comporti diversamente sui due diversi tipi di tag non è una conoscenza ovvia o comune.
Old Pro

104

Basta usare git show <tag>

Tuttavia, scarica anche le differenze di commit. Per omettere quelle differenze, usa git log -1 <tag>. (Grazie a @DolphinDream e @demisx!)


7
Su SO, quando una domanda ha molte possibili risposte diverse, le risposte che vengono postate per prime vengono valutate per prime, mettendole in cima all'elenco e ottenendo così più voti in seguito. Questo è un circuito di feedback di polarizzazione basato sulla velocità di risposta rispetto alla qualità della risposta. Con sufficiente immaginazione questo problema potrebbe essere risolto.
Samthebest,

6
"La migliore soluzione" per cosa? Se l'interesse è scoprire lo SHA di un commit, il tag punta a "git show <mytag>" NON è la soluzione migliore. Questo comando mostrerà l'intera diff introdotta dal commit. Per elencare solo lo SHA del commit, il tag punta su "git rev-list <mytag> -n 1" è la soluzione corretta.
DolphinDream,

Questa non è la risposta alla domanda del PO. git show <tag>mostra il diff, non il commit a cui punta il tag.
Demisx,

@demisx Di cosa stai parlando ?? Mostra sicuramente l'hash di commit, insieme a tagger, data e altre informazioni. Provalo.
Hlung,

4
@Hlung Come ha sottolineato @DolphinDream, git showscarica molte più cose sullo schermo che non hanno bisogno di essere lì. Oscura l'attuale hash di commit che stai cercando. Un comando migliore è git log -1 [tag-name]o git log -1 --pretty=oneline [tag-name]se vuoi oneliners.
Demisx,

40

Sul mio repository, git show-ref TAGmostra l'hash del tag, non l'hash del commit a cui punta.

git show-ref --dereference TAG mostra, inoltre, il commit indicato.


34

Da Igor Zevaka :

Sommario

Dal momento che ci sono circa 4 risposte quasi ugualmente accettabili ma diverse, riassumerò tutti i diversi modi di scuoiare un tag.

  1. git rev-list -1 $TAG( risposta ). git rev-listgenera i commit che portano al $TAGsimile git logma mostrano solo SHA1 del commit. L' -1limita l'uscita al commit punta a.

  2. git show-ref --tags( risposta ) mostrerà tutti i tag (locali e recuperati da remoto) e i loro SHA1.

  3. git show-ref $TAG( risposta ) mostrerà il tag e il suo percorso insieme a SHA1.

  4. git rev-parse $TAG( risposta ) mostrerà SHA1 di un tag non annotato.

  5. git rev-parse --verify $TAG^{commit}( risposta ) mostrerà un SHA1 di tag sia annotati che non annotati. Su Windows usa git rev-parse --verify %TAG%^^^^{commit}(quattro cappelli).

  6. cat .git/refs/tags/*o cat .git/packed-refs( risposta ) a seconda che il tag sia locale o recuperato da remoto.


33

Uso

git rev-parse --verify <tag>^{commit}

(che restituirebbe SHA-1 di un commit anche per tag annotato).


git show-ref <tag>funzionerebbe anche se <tag>non fosse annotato. E c'è sempre git for-each-ref(vedere la documentazione per i dettagli).


11
Preferisco git rev-parse <tag>~0anche quello che sembra funzionare e non richiede alcuna fuga speciale su Windows (su cui sono necessari quattro cappelli (^) anziché uno). Il suffisso ~<number>indica il <numero> commit del genitore, quindi ~0produce il commit stesso. A proposito, ^0è anche una scorciatoia valida per il ^{commit}suffisso di revisione.
Attila,

15

Cosa ne pensi di questo:

git log -1 $TAGNAME

O

git log -1 origin/$TAGNAME

10

Per ottenere lo sha / hash del commit a cui fa riferimento un tag (non lo sha del tag):

git rev-list -1 <tag>


8

Mi piacerebbe anche conoscere il modo "giusto", ma nel frattempo puoi farlo:

git show mytag | head -1    

Con titolo di commitgit show --oneline mytag | head -1
Stphane

7

Anche se questo è piuttosto vecchio, ho pensato di sottolineare una caratteristica interessante che ho appena trovato per elencare i tag con commit:

git log --decorate=full

Mostrerà i rami che terminano / iniziano a un commit e i tag per i commit.


4

Potresti anche ottenere un'immagine più facile da interpretare di dove i tag puntano a utilizzare

git log --graph |git name-rev --stdin --tags |less

e quindi scorrere fino al tag che stai cercando tramite /.

Una vista più compatta ( --pretty=oneline) più tutte le teste ( -a) potrebbe anche aiutare:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

Sembra un po 'terrificante, ma potrebbe anche essere aliasato ~/.gitconfigse necessario.

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

4

Breve risposta post-Git-2

So che questa domanda è in discussione da un po 'di tempo. E la risposta di CB Bailey è corretta al 100%:git show-ref --tags --abbrev

Mi piace di più perché utilizza git tag:

git tag --list --format '%(refname:short) %(objectname:short)'

Semplice. Corto.

PS alias come git taglistcon questo comando:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"

3

Dalla mailing list di git , ecco il modo per ottenere l'elenco di hash di commit per tag con dereferenziazione automatica per tag con annotazioni:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

2

Questo non mostra i nomi dei file, ma almeno hai un'idea del repository.

cat .git/refs/tags/*

Ogni file in quella directory contiene un SHA di commit che punta a un commit.


Non ha funzionato perché, credo, ho estratto i tag dal telecomando. .git/packed-refsha funzionato però.
Igor Zevaka,

2

Mi piacerebbe anche sapere nel modo giusto , ma puoi sempre dare un'occhiata anche a:

$ cat .git/packed-refs 

o:

$ cat .git/refs/tags/*

Giusto, quindi il comportamento per pacchetti-ref e ref / tag è un po 'diverso, pacchetto-ref è un file di testo contenente tag e SHA, mentre refs / tag / è una directory con file di testo che prende il nome da un tag contenente lo SHA. In realtà penso che il modo corretto di farlo sia con git rev-list.
Igor Zevaka,

2

Questo ti porterà l'attuale hash SHA1

Abbreviato Commit Hash

git show <tag> --format="%h" --> 42e646e

Commit Hash

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

1
non sembra funzionare nella versione che ho, ma git log <tag> -n 1 --pretty=%H fa
Andy,

2

Se desideri vedere i dettagli del tag SOMETAG (tagger, data, ecc.), L'hash del commit a cui punta e un po 'di informazioni sul commit ma senza il diff completo, prova

git show --name-status SOMETAG

Esempio di output:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....

0

Quindi ho un sacco di cartelle di rilascio, in cui quelle cartelle possono essere estratte da uno di alcuni repository diversi e possono essere dev, qa o rami master o possono essere versioni di produzione, estratte da un tag e il tag può essere annotato o no. Ho uno script che guarderà la cartella di destinazione e tornerà una risposta nel modulo -. Il problema è che versioni diverse di git restituiscono uno stato diverso 'per un checkout di tag.

Così ho trovato git show-ref --tags funzionato inizialmente, ad eccezione dei tag annotati. Tuttavia aggiungendo -d è stata aggiunta una voce separata all'elenco dei tag, uno per il tag, l'altro per l'annotazione (il commit delle annotazioni è stato identificato come ^ {} che ho eliminato con sed).

Quindi questo è il nocciolo della mia sceneggiatura, per chiunque lo voglia: -

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi

0

Può usare sotto, darà l'hash di commit
git show -s --format=%H <tag>^{commit}

Se è richiesto l'hash di commit abbreviato, git show -s --format=%h <tag>^{commit}

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.