Risposte:
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.
git show-ref --tags -d
. I tag dereferenziati sono contrassegnati da un suffisso ^{}
.
Il git tag
comando è 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 t
e git tags
come 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 t
perché 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 --date
nell'opzione, nonché controllare completamente l'output per soddisfare il proprio gusto unico --pretty
nell'opzione. Entrambe le opzioni sono ben documentate nella documentazione di git-log .
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 --date
nella pagina della guida. Ho aggiornato la mia risposta per includere questa opzione.
--pretty
e %H
. Grazie per il +1 :)
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^{}
git log --tags --oneline --no-walk
deferirà automaticamente anche i tag annotati. :)
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 ^0
suffisso è 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!
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? .
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
.
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 .
%(refname:short)
invece di %(refname)
.
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 -n
ma 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:short
con objectname
.
git tag
(-n
o 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.