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

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

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 ]

15 голосов
/ 23 мая 2011
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 определяет ключ сортировки для третьего поля (и только для третьего поля)
4 голосов
/ 25 марта 2014

Вы скоро (с Git 1.9.x / 2.0, Q2 2014) сможете использовать git только для получения правильно отсортированного вывода:

См. commit b6de0c6 , от commit 9ef176b , автор Nguygun 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
4 голосов
/ 23 мая 2011

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

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