Git Tag list, mostra gli hash sha1 dei commit


101

quindi il git tagcomando elenca i tag git correnti

tag1
tag2

git tag -n stampa il messaggio del tag

tag1  blah blah
tag2  blah blah

Qual è il modo migliore per ottenere l'hash di tag1 e tag2?


1
Non è una domanda che considero di chiedere separatamente, ma mi chiedo perché git tag( -no qualche altra opzione ...) non mostri gli hash di commit in primo luogo. È bello vedere quali soluzioni le persone escogitano, ma lo considero un difetto di progettazione nelle opzioni disponibili.
andreee

Risposte:


142

Per ottenere tag git con l'hash SHA1 dell'oggetto Tag, puoi eseguire:

git show-ref --tags

L'output sarà quindi simile a:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0

Ogni riga è l'hash SHA1 del tag, seguito dal nome del tag con prefisso refs/tags/.

Se vuoi l'hash SHA1 del commit, invece dell'oggetto tag, puoi eseguire:

git show-ref --tags -d

Questo produrrà output come:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}

Le righe che terminano con ^{}iniziano con l'hash SHA1 del commit effettivo a cui punta il tag.


7
Nota, questo non farà differenza tra tag leggeri e annotati. Per i tag leggeri mostrerà il commit e per i tag annotati mostrerà l'hash dell'oggetto tag stesso.
Lily Ballard

20
Per mostrare un elenco di tag con riferimenti dereferenziati (in caso di tag annotati) utilizzare git show-ref --tags -d. I tag dereferenziati sono contrassegnati da un suffisso ^{}.
S. Christoffer Eliesen

49

Il git tagcomando è sottosviluppato. Si desidera molto ma manca in esso, come i dettagli completi dei tag e i tag nell'ordine della cronologia di commit.

Mi piace invece questo, che dà esattamente quello che voglio ma da cui non posso ottenere git tag:

git log --oneline --decorate --tags --no-walk

Ciò fornisce una visualizzazione codificata a colori molto piacevole dei tag in ordine cronologico inverso (come sarebbe nel registro completo). In questo modo, non solo vedrai i tag, ma vedrai anche gli hash abbreviati ei messaggi di commit dei tag commit.


L'ho alias git te git tagscome segue:

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

Nota: ho dovuto usare il reindirizzamento bash git tperché Git non supporta la chiamata di un alias da un altro alias (che è un peccato).


Se vuoi vedere la data e l'ora del commit, prova:

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

È possibile utilizzare altri formati di data --datenell'opzione, nonché controllare completamente l'output per soddisfare il proprio gusto unico --prettynell'opzione. Entrambe le opzioni sono ben documentate nella documentazione di git-log .


2
Sebbene non sia quello che ha chiesto l'OP (visualizzare gli hash sha1 dei commit ) è molto utile poiché anche i messaggi di commit potrebbero essere utili. +1 da me.
Stelios Adamantidis

2
@nealmcb git logè potente! Puoi fargli mostrare esattamente quello che vuoi. Prova git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. Sono possibili anche altri formati di data. Basta cercare --datenella pagina della guida. Ho aggiornato la mia risposta per includere questa opzione.
ADTC

1
@SteliosAdamantidis In realtà la mia risposta fornisce gli hash SHA1 abbreviati (primi 7 caratteri), e se vuoi hash a lunghezza intera, puoi sempre modificarli con --prettye %H. Grazie per il +1 :)
ADTC

15

I tag annotati hanno il proprio SHA − 1, quindi è necessario dereferenziarli. Tuttavia, i tag leggeri non possono essere dereferenziati, poiché puntano già a un commit. Per risolvere, dobbiamo elencare entrambi e filtrare gli oggetti di commit:

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

Risultato con tag leggeri:

589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5

Risultato con tag annotati:

e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}

L'uso di git log --tags --oneline --no-walkdeferirà automaticamente anche i tag annotati. :)
ADTC

11

Per ottenere lo SHA1 a cui fa riferimento qualsiasi tipo di riferimento (ramo, tag ...) utilizzare git rev-parse:

git rev-parse tag1^0 tag2^0

Stamperà solo gli SHA1 completi, su righe separate. Il ^0suffisso è una sintassi speciale, per garantire che questo stamperà SHA1 del commit a cui punta il tag, che sia annotato o meno. (I tag annotati sono oggetti a sé stanti, che contengono un puntatore a un commit insieme ai metadati. Se sai che un tag è annotato e desideri SHA1 del tag, lascia semplicemente fuori ^0.)

Ovviamente, non dovresti aver bisogno di farlo spesso, poiché qualsiasi comando Git che accetti un SHA1 dovrebbe accettare anche un tag!


Migliore risposta qui, grazie @Jefromi. Notare che in una shell cmd di Windows qualsiasi comando git che utilizza ^ deve essere citato: es. Git rev-parse "tag1 ^ 0" "tag2 ^ 0".
yoyo

8

Avevo una domanda simile, ma volevo l'hash di (diversi) tag specifici. Ho scoperto che "show-ref" prenderà un elenco di tag, quindi questo fa il lavoro:

% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga

Tuttavia, alcuni esperimenti con "git show" hanno prodotto questo comando:

% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second

Dato che ho molta più familiarità con l'uso di "show" che di "show-ref", trovo quest'ultimo più facile da ricordare e anche più utile.

Vedi anche il bel riepilogo in Come dire a quale commit punta un tag in Git? .


3

I tag devono essere firmati e / o inviati tramite messaggio. I tag leggeri non hanno oggetti SHA1 e sono solo riferimenti. Altrimenti prova git show.


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

Questo fornisce un elenco di tutti i commit per i tag. I tag annotati vengono dereferenziati. Invia grazie qui .


Ottima soluzione. Se ti piace avere solo nomi di tag invece del refname completo, puoi cambiare use %(refname:short)invece di %(refname).
Radon8472

2

Ho preso il comando da anatoly techtonik post aggiunto il messaggio del titolo dei tag / commit e l'ho formattato come belle colonne.

Il risultato è un output identico a git tag -nma con commit-hash come prefisso.

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

Se ti piace avere il long-hash invece di quello corto, devi sostituirlo objectname:shortcon objectname.

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.