Come sapere a quale tag commit si punta in Git?

Ho un sacco di tag non annotati nel repository e voglio capire a quale commit puntano. C’è un comando che indicherà solo i tag e i loro SHA di commit? Controllare il tag e guardare la TESTA 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 cronologia che portava al tag, per il quale git log è sufficiente.

La risposta contrassegnata come risposta è utile per ottenere un elenco di tag e i loro commit, che è quello che ho chiesto. Con un po ‘di hackeraggio della shell sono sicuro che è ansible trasformarli in SHA + Commit message.

Un modo per farlo sarebbe con git rev-list . Quanto segue mostrerà il commit a cui un tag punta:

 $ git rev-list -n 1 $TAG 

Puoi aggiungerlo come alias in ~/.gitconfig se lo usi molto:

 [alias] tagcommit = rev-list -n 1 

E poi chiamalo con:

 $ git tagcommit $TAG 
 git show-ref --tags 

Ad esempio, git show-ref --abbrev=7 --tags ti mostrerà qualcosa come il 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 

Usa semplicemente git show

Tuttavia, esegue anche il dump delle differenze di commit. Per omettere tali diff, usa git log -1 . (Grazie a @DolphinDream e @demisx!)

Uso

 git rev-parse --verify ^{commit} 

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


git show-ref funzionerebbe anche se non è annotato. E c’è sempre git for-each-ref (vedi la documentazione per i dettagli).

Sul mio repository, git show-ref TAG mostra l’hash del tag, non l’hash del commit a cui punta.

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

Da Igor Zevaka :

Sommario

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

  1. git rev-list -1 $TAG ( risposta ). git rev-list emette i commit che portano a $TAG simili a git log ma mostrano solo SHA1 del commit. Il -1 limita l’output al commit a cui punta.

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

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

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

  5. git rev-parse --verify $TAG^{commit} ( risposta ) mostrerà uno SHA1 di entrambi i tag annotati e 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.

Cosa ne pensi di questo:

 git log -1 $TAGNAME 

O

 git log -1 origin/$TAGNAME 

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

git rev-list -1

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

 git show mytag | head -1 

Si potrebbe anche ottenere un’immagine più facile da interpretare di dove puntano i tag

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

e poi scorri 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 alias in ~/.gitconfig se necessario.

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

Questo ti porterà l’attuale hash SHA1

Commit Hash abbreviato

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

Impegna Hash

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

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

 git log --decorate=full 

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

mi piacerebbe anche conoscere la strada giusta , ma puoi sempre dare un’occhiata a:

 $ cat .git/packed-refs 

o:

 $ cat .git/refs/tags/* 

Se desideri visualizzare i dettagli del tag SOMETAG (tagger, data, ecc.), L’hash del commit a cui punta e un po ‘di informazioni sul commit ma senza la differenza completa, 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) ..... 

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 commit SHA che punta a un commit.

Da git mailing list , ecco il modo per ottenere l’elenco degli hash di commit per i tag con il dereferenziamento automatico per i tag annotati:

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

Quindi ho un carico di cartelle di rilascio, in cui queste cartelle possono essere estratte da uno dei pochi 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 ottenere una risposta nel modulo -. Il problema sono le diverse versioni di git restituiscono diversi stati per il checkout di un tag.

Quindi ho scoperto che git show-ref --tags funzionava inizialmente, ad eccezione dei tag annotati. Comunque aggiungendo -d ha aggiunto una voce separata alla lista dei tag, uno per il tag, l’altro per l’annotazione (il commit dell’annotazione è stato identificato come ^ {} che ho rimosso con sed).

Quindi questo è il nucleo del mio script, per chiunque lo desideri: –

 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 

Può usare sotto, darà l’hash del commit
git show -s --format=%H ^{commit}

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