Come trovare il tag associato a un dato commit git?


90

Per le versioni di solito taggo con qualcosa come v1.1.0. Durante il mio script di build creo un file fwVersion.c che contiene le informazioni git correnti. Attualmente, ho commit e informazioni sul ramo nel file, ma vorrei aggiungere il tag.

È possibile?

Risposte:


114

Controlla la documentazione per git describe. Trova il tag più vicino a un dato commit (che è un tag che punta a un antenato del commit) e descrive quel commit in termini di tag.

Se vuoi solo sapere se il commit è puntato da un tag, puoi controllare l'output di:

git describe --exact-match <commit-id>

32
git describe --tags <commit-id>per tag non
annotati

1
Amo questo. In particolare, mi piace il fatto di poter ottenere un umano leggibile dalla revisione corrente:git describe --all --exact-match `git rev-parse HEAD`
dsummersl

5
Nelle versioni più recenti, git describe --tags --abbrev=0 REVsarà utile quando non vuoi la spazzatura sul tag.
Craig Ringer

1
git describe --all(per il commit attualmente verificato) o git describe --all <commit>ho sempre fatto quasi tutto ciò che volevo.
rfay

La parte migliore dell'utilizzo delle versioni da git non è più l'hardcoding della versione nel codice sorgente quando viene distribuito un software. Il modo in cui git descrive per trovare il tag più vicino può essere utilizzato per calcolare il numero di versione successivo e aggiungere semplicemente un tag ref al repository e il nome del pacchetto.
Sid

62

Se quello che vuoi è il primo tag contenente il commit, allora:

git describe --contains <commit>

dà la migliore risposta IMO. Se si hanno tag frequenti rispetto all'utilizzo di "git tag --contains" su un vecchio commit in un grande repository può essere necessario un po 'di tempo per essere eseguito e fornisce tutti i tag che contengono quel commit.

Questa forma di descrizione git viene eseguita molto rapidamente e fornisce un singolo valore di output che è il primo tag contenente il commit e quanto è lontano il tuo commit.


27

Cosa ne pensi di questo?

git tag --points-at <commit-id>

Ti dà tutti i tag che ha il commit dato (mentre git describete ne dà solo uno) e non include i tag sui commit discendenti (come git tag --containsfa).


Mi piace perché nessun messaggio di errore viene scritto su stderr. Grazie.
Basuke

23

Puoi trovare queste informazioni nel manuale

git tag --contains <commit>

3
Questo elencherà tutti i tag che contengono il commit dato (cioè i tag che puntano ai figli del commit dato), quindi non darà necessariamente un singolo tag per un dato commit o qualsiasi informazione su quale tag è più vicino, a meno che il list contiene solo un singolo commit.
CB Bailey

4
Come dice Charles Bailey sopra, non è esattamente quello che sto cercando. Forse dovresti RTFM :)
wes

1
Bene, scusa per la risposta sbagliata. Quando ho controllato sembrava che facesse quello che stavi chiedendo. Ho fatto RTFM, stavo solo risolvendo il problema sbagliato. Hope Bailey ha offerto una soluzione che ti aiuta.
dharga,

6
non dovresti aver bisogno di leggere l'intero manuale di git prima di fare una domanda su git su SO, giusto? google indexes
MOLTO

13

Ho trovato la combinazione di entrambe le risposte migliori per darmi quello che volevo in questo modo:

git describe --tags --exact-match <commit-id>

Questo ti dà il tag che è SOLO per quel commit e per quelli senza annotazione. Utile quando vuoi trovare i tag e non preoccuparti di rimuovere la formattazione (ad esempio per Jenkins).

per esempio. $ git describe --tags --exact-match head~2

Ti dà:

$ ReleaseBeta

0

Consolidare alcune delle risposte:

git tag --contains [<ref>]

e

git tag --points-at [<ref>]

o semplicemente

git tag

si comportano allo stesso modo, stampando qualsiasi (e tutti) i tag per il riferimento specificato o il commit corrente se non specificato.

git describe --tags [<ref>]

dove il <ref>valore predefinito è il commit corrente, esce con 128 se nessun tag è associato al commit e stampa un tag associato al commit (non sembra esserci un pattern).

git describe [<ref>] si comporta come con --tagstranne per il fatto che stampa solo i tag annotati.

Fornendo l'opzione --containsper describeverrà stampato il tag associato a un antenato del commit specificato. Per esempio

$ git init
Initialized empty Git repository in /tmp/test
$ git commit -m one --allow-empty
[master (root-commit) 7fdfff2] one
$ git commit -m two --allow-empty
[master cd5f8f1] two
$ git tag -am foo foo
$ git tag bar
$ git log --format=oneline
cd5f8f1f4f29eb164f83e224768ccaf37fe170ed (HEAD -> master, tag: foo, tag: bar) two
7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1 one
$ git describe 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
fatal: No tags can describe '7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1'.
Try --always, or create some tags.
$ git describe --contains 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
bar~1

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.