Ответ 1
Простое решение:
serv ~: echo -e "1.1.1\n1.3.2\n1.1.10\n1.1.2" | sort -V
1.1.1
1.1.2
1.1.10
1.3.2
Разбивка параметров sort
, используемых здесь:
- -V сортировать по версии
Рассмотрим этот список номеров версий:
0.3.0
0.3.1
...
0.3.8
0.3.9
0.3.10
0.3.11
git tag
будет печатать их в следующем порядке:
0.3.0
0.3.1
0.3.10
0.3.11
0.3.2
...
Есть ли способ сделать git tag
напечатать их в числовом порядке, а не в алфавитном порядке? Или обходной путь - возможно, программа, с которой я могу выполнить вывод, чтобы упорядочить их, как я хочу?
Простое решение:
serv ~: echo -e "1.1.1\n1.3.2\n1.1.10\n1.1.2" | sort -V
1.1.1
1.1.2
1.1.10
1.3.2
Разбивка параметров sort
, используемых здесь:
serv ~: echo -e "1.1.1\n1.3.2\n1.1.10\n1.1.2" | sort -n -t. -k1,1 -k2,2 -k3,3
1.1.1
1.1.2
1.1.10
1.3.2
Разбивка параметров sort
, используемых здесь:
-n
- сортировка с использованием порядкового номера (таким образом 10
появляется после 1
)-t.
- использовать периоды в качестве разделителей полей-k1,1
определить ключ сортировки в первом поле (и только в первом поле)-k2,2
определить ключ сортировки во втором поле (и только второе поле)-k3,3
определить ключ сортировки в третьем поле (и только в третьем поле)Вы скоро (с Git 1.9.x/2.0, Q2 2014) сможете использовать Git только для получения правильного сортированного вывода:
См. commit b6de0c6, из commit 9ef176b, автор Nguyễn Thái Ngọc Duy (pclouds
):
--sort=<type>
Сортировка в определенном порядке.
Поддерживаемый тип:
- "
refname
" (лексикографический порядок),- "
version:refname
" или "v:refname
" (имена тегов рассматриваются как версии).Подготовьте "
-
" для отмены порядка сортировки.
В вашем случае:
git tag -l --sort=version:refname
Несколько тестовых случаев:
git tag foo1.3 &&
git tag foo1.6 &&
git tag foo1.10
Вот что вы получите:
# lexical sort
git tag -l --sort=refname "foo*"
foo1.10
foo1.3
foo1.6
# version sort
git tag -l --sort=version:refname "foo*" >actual &&
foo1.3
foo1.6
foo1.10
# reverse version sort
git tag -l --sort=-version:refname "foo*" >actual &&
foo1.10
foo1.6
foo1.3
# reverse lexical sort
git tag -l --sort=-refname "foo*" >actual &&
foo1.6
foo1.3
foo1.10