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*