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 tag
ha 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 tag
para 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_ref
para 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/foo
enfoo
.
<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
prereleaseSuffix
de 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-beta1
y2.0-beta2
están allí y el código necesita comparar2.0-beta1
y2.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