¿Cómo encontrar la etiqueta asociada con una determinada confirmación de git?

90

Para los lanzamientos suelo etiquetar con algo como v1.1.0. Durante mi script de compilación, estoy creando un archivo fwVersion.c que contiene la información de git actual. Actualmente, tengo información de confirmación y rama en el archivo, pero me gustaría agregar la etiqueta.

es posible?

wes
fuente

Respuestas:

114

Consulte la documentación git describe. Encuentra la etiqueta más cercana a una confirmación determinada (es decir, una etiqueta que apunta a un antecesor de la confirmación) y describe esa confirmación en términos de la etiqueta.

Si solo desea saber si una etiqueta apunta a la confirmación, puede verificar el resultado de:

git describe --exact-match <commit-id>
CB Bailey
fuente
32
git describe --tags <commit-id>para etiquetas no
anotadas
1
Me encanta esto. Específicamente, me encanta que puedo obtener una lectura humana de la revisión actual:git describe --all --exact-match `git rev-parse HEAD`
dsummersl
5
En las versiones más recientes, git describe --tags --abbrev=0 REVserá útil cuando no desee la basura en la etiqueta.
Craig Ringer
1
git describe --all(para el compromiso actualmente verificado) o git describe --all <commit>siempre he hecho casi todo lo que siempre quise.
rfay
La mejor parte de usar versiones de git es no más codificación de la versión en la fuente cuando se implementa un software. La forma de git describe de encontrar la etiqueta más cercana se puede usar para calcular el siguiente número de versión y simplemente agregar una referencia de etiqueta al repositorio y al nombre del paquete.
Sid
62

Si lo que quieres es la primera etiqueta que contiene la confirmación, entonces:

git describe --contains <commit>

da la mejor respuesta en mi opinión. Si tiene etiquetas frecuentes, entonces el uso de "git tag --contains" en una confirmación anterior en un repositorio grande puede tardar un poco en ejecutarse y le proporciona todas las etiquetas que contienen esa confirmación.

Esta forma de git describe se ejecuta muy rápidamente y le da un valor de salida único que es la primera etiqueta que contiene la confirmación y qué tan atrás está su confirmación.

Arrendajo
fuente
27

¿Qué tal esto?

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

Te da todas las etiquetas que tiene la confirmación dada (mientras que git describesolo te da una), y no incluye etiquetas en las confirmaciones descendientes (como git tag --containshace).

Albertas Agejevas
fuente
Me gusta esto porque no se escribe ningún mensaje de error en stderr. Gracias.
Basuke
23

Puede encontrar esta información en el manual

git tag --contains <commit>
dharga
fuente
3
Esto enumerará todas las etiquetas que contienen la confirmación dada (es decir, etiquetas que apuntan a los hijos de la confirmación dada), por lo que no necesariamente dará una sola etiqueta para una confirmación determinada o cualquier información sobre qué etiqueta es la más cercana, a menos que el La lista solo contiene una única confirmación.
CB Bailey
4
Como dice Charles Bailey anteriormente, eso no es exactamente lo que estoy buscando. Quizás deberías RTFM :)
wes
1
Bueno, perdón por la respuesta incorrecta. Cuando lo comprobé, pareció hacer lo que pedías. Hice RTFM, solo estaba resolviendo el problema equivocado. Hope Bailey ofreció una solución que le ayuda.
Dharga
6
no debería tener que leer todo el manual de git antes de hacer una pregunta de git sobre SO, ¿verdad? Google indexa TAN mucho mejor que cualquier página de manual de git ...
aaronstacy
13

Encontré la combinación de las dos respuestas principales para darme lo que quería, así:

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

Esto le da la etiqueta que es SOLO para esa confirmación y para aquellas sin anotación. Útil cuando desea encontrar etiquetas y no preocuparse por eliminar el formato (para Jenkins, por ejemplo).

p.ej. $ git describe --tags --exact-match head~2

Te dio:

$ ReleaseBeta
Christopher Alexander
fuente
0

Consolidando algunas de las respuestas:

git tag --contains [<ref>]

y

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

o solo

git tag

se comportan de la misma manera, imprimiendo todas (y todas) las etiquetas para la referencia especificada o la confirmación actual si no se especifica.

git describe --tags [<ref>]

donde por <ref>defecto es la confirmación actual, sale con 128 si no hay etiquetas asociadas con la confirmación e imprime una etiqueta asociada con la confirmación (no parece haber un patrón).

git describe [<ref>] se comporta de la misma forma que con --tagsexcepto que solo imprime etiquetas anotadas.

El suministro de la opción --containsque describeva a imprimir la etiqueta que se asocia con un antepasado de la confirmación especificada. Por ejemplo

$ 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

bschlueter
fuente