Могу ли я сделать git печатать имена тегов стиля x.y.z в разумном порядке?

Рассмотрим этот список номеров версий:

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 напечатать их в числовом порядке, а не в алфавитном порядке? Или обходной путь - возможно, программа, с которой я могу выполнить вывод, чтобы упорядочить их, как я хочу?

Ответ 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 сортировать по версии

Ответ 2

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 определить ключ сортировки в третьем поле (и только в третьем поле)

Ответ 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