tipos tener tag remove qué proyecto podemos para oneline nuestros mayor log herramienta hacer hace existen etiquetas control regex git tags find tagging

regex - tag - Cómo obtener la última etiqueta Git que coincida con los criterios de expresiones regulares



¿qué hace git log-oneline? (8)

El problema con el uso de git describe como lo hacen las otras respuestas es que git describe le mostrará las etiquetas a las que se puede acceder desde HEAD (o el compromiso que especifique).

Imagina que tienes 3 etiquetas, v1, v2 y v3. Si HEAD se encuentra en un punto entre v2 y v3, git describe devolvería v2 en lugar de v3.

Si realmente desea la última etiqueta, en primer lugar necesita etiquetas anotadas, ya que las etiquetas ligeras no tienen metadatos de fecha.

Entonces este comando lo hará:

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

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

¿Hay alguna forma de hacerlo?


Estoy usando el siguiente comando para esto:

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

También modificará la versión si hiciste algo con el árbol de origen desde tu última etiqueta versionada.

Tenga en cuenta que esto no es una expresión regular sino un globo, pero funciona para el ejemplo proporcionado.


Si bien una sola expresión regular --match "v[0-9]*" es suficiente aquí, sepa que Git 2.13 (Q2 2017) mejorará eso:

" git describe " y " git name-rev " aprendieron a tomar más de un patrón de nombre de referencia para restringir el conjunto de referencias en las que basar su salida de nombres, y también aprendieron a tomar patrones negativos para nombrar a las referencias que no se usarán para nombrar a través de su --exclude " --exclude ".

Consulte commit 77d21f2 , commit 43f8080 , commit 96415b4 , commit 290be66 , commit 4a68748 (18 de enero de 2017) por Jacob Keller ( jacob-keller ) .
(Fusionada por Junio ​​C Hamano - gitster - in commit 1b32498 , 27 de febrero de 2017)

Ahora puedes tener un patrón de coincidencia múltiple :

--match <pattern>:

Solo considere las etiquetas que coinciden con el patrón glob(7) dado, excluyendo el prefijo "refs / tags /".
Esto se puede usar para evitar la pérdida de etiquetas privadas desde el 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 también tienes un patrón de exclusión (o varios) ahora !

--exclude <pattern>::

No considere las etiquetas que coinciden con el patrón glob(7) dado, excluyendo el prefijo "refs / tags /".

Esto se puede usar para reducir el espacio de la etiqueta y encontrar solo etiquetas que coincidan con algunos criterios significativos.
Si se da 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.


También con git describe, puede obtener la última etiqueta no solo accesible desde HEAD con:

git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)


yo suelo

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

git tag interpreta el patrón como glob. Por lo tanto, no puede especificar una expresión regular completa. Solo use un glob mínimo (v *) o incluso ningún glob en absoluto. Recibirá más de una sola etiqueta coincidente en orden ordenado (la versión de etiqueta más alta primero) y luego podrá reexpresar la salida.


La respuesta de KARASZI István ya explica cómo encontrar etiquetas que coincidan con un globo , lo que generalmente es lo suficientemente bueno. Si alguna vez necesitas un RegEx real 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 solo desea la etiqueta más cercana (es decir, lo que --abrev=0 lograría), agregue | cut -d"-" -f1 | cut -d"-" -f1
  • Si no desea el comportamiento de --long de --long también una etiqueta que coincida exactamente, incluida la parte -0-hash , agregue | sed -e''s/-0-.*$//'' | sed -e''s/-0-.*$//'' lugar.

La etiqueta de ejemplo de la pregunta probablemente usaría un Regex ^v/d+/./d+/./d+/D*$ (aunque el /D*$ podría ser opcional).


git describe --match v*

Utilizar esta.


git tag -l -n v*