Можно ли сделать так, чтобы git печатал имена тегов в стиле xyz в разумном порядке?

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

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

3 ответа

Решение

Более простое решение:

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 Nn Thái Ngọc Duy ( pclouds ):

 --sort=<type>

Сортировка в определенном порядке.
Поддерживаемый тип:

  • " refname "(лексикографический порядок),
  • " version:refname " или же " v:refname "(имена тегов рассматриваются как версии).

Prepend " - "изменить порядок сортировки.


В твоем случае:

 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
Другие вопросы по тегам