tag - ¿Cómo ordenar las etiquetas git por orden de cadena de versión del formulario rc-XYZW?
¿qué hace git log-oneline? (6)
Cuando ingreso un comando:
git tag -l
Obtengo tales resultados:
rc-0.9.0.0
rc-0.9.0.1
rc-0.9.0.10
rc-0.9.0.11
rc-0.9.0.12
rc-0.9.0.2
rc-0.9.0.3
rc-0.9.0.4
rc-0.9.0.5
rc-0.9.0.6
rc-0.9.0.7
rc-0.9.0.8
rc-0.9.0.9
En lugar de esto, quiero:
rc-0.9.0.0
rc-0.9.0.1
rc-0.9.0.2
rc-0.9.0.3
rc-0.9.0.4
rc-0.9.0.5
rc-0.9.0.6
rc-0.9.0.7
rc-0.9.0.8
rc-0.9.0.9
rc-0.9.0.10
rc-0.9.0.11
rc-0.9.0.12
¿Cómo es posible ordenar la lista actual para obtener esos resultados?
Adapte este script perl , que ordena las etiquetas que se parecen a client_release/7.2/7.2.25 , a su esquema de etiquetado específico.
Con Git 2.0 (junio de 2014), ¡podrá especificar un orden de clasificación!
Ver commit b6de0c6 , del commit 9ef176b , escrito por Nguyễn Thái Ngọc Duy ( pclouds ) :
--sort=<type>
Ordenar en un orden específico .
El tipo admitido es:
- "
refname" (orden lexicográfica),- "
version:refname" o "v:refname" (los nombres de las etiquetas se tratan como versiones).Prefijo "
-" para invertir el orden de clasificación.
Entonces, si tienes:
git tag foo1.3 &&
git tag foo1.6 &&
git tag foo1.10
Esto es lo que obtendrías:
# lexical sort
git tag -l --sort=refname "foo*"
foo1.10
foo1.3
foo1.6
# version sort
git tag -l --sort=version:refname "foo*"
foo1.3
foo1.6
foo1.10
# reverse version sort
git tag -l --sort=-version:refname "foo*"
foo1.10
foo1.6
foo1.3
# reverse lexical sort
git tag -l --sort=-refname "foo*"
foo1.6
foo1.3
foo1.10
Desde commit b150794 (por Jacob Keller, git 2.1.0, agosto de 2014), puede especificar el orden predeterminado:
tag.sort
Esta variable controla el ordenamiento de las etiquetas cuando se muestra con
git-tag.
Sin la--sort=<value>"--sort=<value>" proporcionada, el valor de esta variable se usará como el predeterminado.
robinst comments :
el orden de clasificación de la versión ahora se puede configurar (Git 2.1+) como predeterminado:
git config --global tag.sort version:refname
Con Git 2.4 (Q2 2015) , la variable de configuración versionsort.prerelease se puede usar para especificar que v1.0-pre1 viene antes de v1.0 .
Ver commit f57610a por Junio C Hamano ( gitster ) .
Nota (ver a continuación) versionsort.prereleaseSuffix es ahora (2017) un alias obsoleto para versionsort.suffix .
git 2.7.1 (febrero de 2016) mejorará la salida de la git tag sí.
Ver commit 0571979 (26 de enero de 2016), y cometer 1d094db (24 de enero de 2016) por Jeff King ( peff ) .
(Fusionada por Junio C Hamano - gitster - in commit 8bad3de , 01 feb 2016)
tag: no mostrar nombres de etiqueta ambiguos como "tags/foo"Desde b7cc53e (
tag.c: use API ''ref-filter'', 2015-07-11), lagit tagha comenzado a mostrar etiquetas con nombres ambiguos (es decir, cuando existen tanto "heads/foo" como "tags/foo") como "tags/foo" en lugar de solo "foo".
Esto es a la vez:
- inútil; la salida de "
git tag" incluye solorefs/tags, por lo que sabemos que "foo" significa la que está en "refs/tags".- y ambiguo; en la salida original, sabemos que la línea "
foo" significa que existe "refs/tags/foo". En el nuevo resultado, no está claro si nos referimos a "refs/tags/foo" o "refs/tags/tags/foo".La razón por la que esto sucede es que commit b7cc53e cambió la
git tagpara usar el formato de salida "%(refname:short)" del ref-filter, que fue adaptado defor-each-ref. Este código más general no sabe que solo nos importan las etiquetas, y usashorten_unambiguous_refpara obtener elshort-name.
Necesitamos decirle que solo nos preocupamos por "refs/tags/", y debe acortarse con respecto a ese valor.agreguemos un nuevo modificador al lenguaje de formato, "
strip", para eliminar un conjunto específico de componentes de prefijo.
Esto corrige "git tag" y permite a los usuarios invocar el mismo comportamiento desde sus propios formatos personalizados (para "tag" o "for-each-ref") dejando ":short" con el mismo significado consistente en todos los lugares.Si se agrega
strip=<N>, quita<N>componentes de ruta separados por barras del frente del refname (p. Ej.,%(refname:strip=2)convierterefs/tags/fooenfoo.
<N>debe ser un entero positivo.
Si una referencia mostrada tiene menos componentes que<N>, el comando aborta con un error.
Para la git tag , cuando no se especifica, el valor predeterminado es %(refname:strip=2) .
Actualizar Git 2.12 (Q1 2017)
Consulte commit c026557 , commit b178464 , commit 51acfa9 , commit b823166 , commit 109064a , commit 0c1b487 , commit 9ffda48 , commit eba286e (08 Dec 2016) por SZEDER Gábor ( szeder ) .
(Fusionado por Junio C Hamano - gitster - in commit 1ac244d , 23 ene 2017)
versionsort.prereleaseSuffix es un alias obsoleto para versionsort.suffix .
La función
prereleaseSuffixde la comparación de versiones que se usa en "git tag -l" no funcionaba correctamente cuando estaban presentes dos o más versiones previas para la misma versión (por ejemplo, cuando2.0,2.0-beta1y2.0-beta2están allí y el código necesita comparar2.0-beta1y2.0-beta2).
De acuerdo con esta answer , en las plataformas que no admiten sort -V como Windows y OSX, puede usar
git tag -l | sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4
Para obtener una clasificación inversa con el método de sort -V :
git tag -l | sort -V --reverse
Terminé escribiendo un simple script de shell para simplificar esta tarea.
#!/usr/bin/env bash
TAGS=$(git tag)
CODE=$?
if [ $CODE = 0 ]; then
echo "$TAGS" | sort -V
fi
exit $CODE
Guardé eso como git-tags en mi $PATH y ejecuto git tags cada vez que necesito listar etiquetas.
Usar tipo de versión
git tag -l | sort -V
o para la versión de git> = 2.0
git tag -l --sort=v:refname
git tag -l --sort=-v:refname # reverse