2010-10-05 22 views
28

Necesito el comando Git para obtener/encontrar la última etiqueta comenzando con 'v' para obtener la última confirmación de la versión (estoy usando etiquetas con la letra v al principio para etiquetar la próxima versión de la aplicación (ejemplo: v0.9.1beta)Cómo obtener la última etiqueta Git que coincida con los criterios regex

¿hay alguna manera de hacerlo

+1

puede simplemente usar 'describe' git? – Daenyth

+0

Sí ... git describe --match v * era lo que necesitaba. Gracias. – Lukasz

+1

¿Alguien puede editar el título, ya que para esto no es necesario utilizar realmente una expresión regular? Además, toda la respuesta solo usa el patrón de coincidencia y "glob". Gracias. – d4Rk

Respuesta

39

estoy usando el siguiente comando para esto:.?

git describe --match "v[0-9]*" --abbrev=4 HEAD 

También modificará la versión si hizo algo con el árbol de fuentes desde su última etiqueta versionada.

Tenga en cuenta que esto es no un regex pero un pegote pero funciona para el ejemplo proporcionado.

+2

Si solo desea la etiqueta, use la "salida corta" con '--abbrev = 0'. –

+3

El ['git describe' doc] (https://git-scm.com/docs/git-describe) dice que' --match' toma un glob, no una expresión regular. –

+0

@CraigMcQueen que es un pegote, y es por eso que está trabajando y filtra 'v1.0.0' y no solo' v1234'. Agregué una nota para aclarar eso. –

4
git tag -l -n v* 
+2

Enumera todos los criterios de coincidencia de etiquetas. Solo necesito una, así que git describe --match v *. De todos modos, gracias por las pistas, ya que las etiquetas y el comando de descripción están unidos entre sí en las páginas del manual de git. – Lukasz

2
git describe --match v* 

Use esto.

+1

esto incluirá todas las etiquetas comienza con 'v', por lo que listará todas las palabras no solo versiones –

+0

Sí ... eso es verdad. De todos modos, marqué tu expresión regular para resolver mi pregunta. ¿Debo eliminar esta respuesta? – Lukasz

+0

gracias por la aceptación! no, creo que no es necesario eliminar esta respuesta. –

0

utilizo

git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*" 

git tag interpreta el patrón como glob. Entonces no puedes especificar una expresión regular completa. Solo usa un glob mínimo (v *) o incluso ningún glob en absoluto. Recibirá más de una etiqueta coincidente en orden ordenado (la más alta es la primera) y luego podrá volver a generar la salida.

3

KARASZI István's answer ya explica cómo encontrar etiquetas que coincidan con un glob, que por lo general es suficiente. Si alguna vez necesita un verdadero RegEx sin embargo:

for tag in $(git tag | grep YOURREGEX); do 
    git describe --tags --long --match="$tag" 2>/dev/null 
done | sort -k2 -t"-" | head -n1 
  • Si sólo desea la etiqueta más cercano (es decir, lo que se lograría --abrev=0), anexar | cut -d"-" -f1
  • Si no desea --long 's comportamiento de también generar exactamente etiqueta que coincide con la parte -0-hash, añada | sed -e's/-0-.*$//' en su lugar.

etiqueta ejemplo de la pregunta sería, probablemente, utilizar una expresión regular ^v\d+\.\d+\.\d+\D*$ (aunque el \D*$ podría ser opcional).

+0

... aunque esto es obviamente peor en términos de rendimiento, ya que 'git describe' se ejecuta para cada etiqueta que coincida con el RegEx. –

+0

Gracias por esto :) –

2

Mientras que una sola expresión regular --match "v[0-9]*" es suficiente aquí, saben que Git 2,13 (Q2 2017) mejorará que:

"git describe" y "git name-rev" se les ha enseñado a tener más de un patrones RefName para restringir el conjunto de referencias para basar su salida de nomenclatura , y también aprendió a tomar patrones negativos a nombre refs que no se utilizarán para nombrar a través de su opción "--exclude".

Ver commit 77d21f2, commit 43f8080, commit 96415b4, commit 290be66, commit 4a68748 (18 Ene 2017) por Jacob Keller (jacob-keller).
(Fusionado por Junio C Hamano -- gitster -- en commit 1b32498 27 Feb 2017)

Ahora puede tener multiple match pattern:

--match <pattern>: 

considerar sólo las etiquetas que concuerden con la glob(7) patrón determinado, con exclusión de los "refs/tags/"prefijo.
Esto se puede utilizar para evitar la filtración de etiquetas privadas del repositorio.

Si se da varias veces, se acumulará una lista de patrones y se considerarán las etiquetas que coincidan con cualquiera de los patrones.
Utilice --no-match para borrar y restablecer la lista de patrones.

¡Y usted también tiene exclude pattern (or several) now!

--exclude <pattern>:: 

no tienen en cuenta las etiquetas que coinciden con el patrón dado glob(7), excluyendo el "refs/etiquetas /" prefijo.

Esto se puede utilizar para restringir el espacio de etiquetas y encontrar solo etiquetas que coincidan con algunos criterios significativos.
Si se administra varias veces, se acumulará una lista de patrones y se excluirán las etiquetas que coincidan con cualquiera de los patrones.
Cuando se combina con --match se considerará una etiqueta cuando coincida con al menos un patrón --match y no coincida con ninguno de los patrones --exclude.
Utilice --no-exclude para borrar y restablecer la lista de patrones.

1

El problema con el uso git describe como las otras respuestas hacer es que git describe le mostrará las etiquetas que son accesibles desde la cabeza (o la confirmación que se especifique.)

Imagine que tiene 3 etiquetas, v1, v2, y v3. Si HEAD está en un punto entre v2 y v3, git describe devolverá v2 en lugar de v3.

Si realmente desea la última etiqueta, antes que nada necesita etiquetas anotadas ya que las etiquetas livianas no tienen metadatos de fecha.

A continuación, este comando lo hará:

git for-each-ref --sort=-taggerdate --count=1 refs/tags/v*

Cuestiones relacionadas