Как найти самый последний тег для текущей ревизии в Git / HG / Bzr? - PullRequest
2 голосов
/ 15 ноября 2011

В настоящее время в своей практике я использую файл VERSION для хранения:

major=2
minor=0
fix=1

, что означает, что источники для версии продукта v2.0.1 или новее.

Перед каждым выпуском я должен зафиксировать обновление этого файла, чтобы тег с именем tag2.0.1 или release-2.0.1 охватывал содержимое выше (а не предыдущую версию!).

Я думаю, что можно избежать этой работы, автоматически генерируя файл VERSION из сценария сборки.

Смотрите историю оборотов:

  +--+-----+----------------------+-YY--+----+------+------+-HH-->
  dev|     |            ^     ^   |     |    |      |      |
     |     |            |     |   |     |    v      v      v
     |     |            |     |   |     |    +--+------+-ZZ---+-->
     |     |            |     |   |     |    b2 |      |      |
     |     |            |     |   |     |       v      v      v
     |     |            |     |   |     |      t2.0.0 t2.0.1 t2.1.0
     v     v            |     |   v     v
    t0.1.0 +---+--XX--+-+---+-+-----+------+------+------+------+--->
           b1  |      |     |       |      |      |      |      |
               v      v     v       v      v      v      v      v
              t1.0.0 t1.0.1 t1.0.2 t1.1.0 t1.2.0 t1.2.1 t1.2.2 t1.2.3

В точке XX версия 1.0.0 , в точке ГГ версия 1.0.2 , в точке ZZ версия 2.0.1 .

Для точки ЧЧ это не знаю, как установить версию. Я думаю, что это должно быть 1.0.2 , потому что мы не объединяем ветку dev с веткой релиза b2 .

Я прочитал:

  $ hg help revsets

но не вижу, как найти ближайший тег к данной ревизии. С Git и Bzr у меня меньше опыта ...

Или, если это невозможно, я ищу аргументы. Также мне нравится слышать, как избегать ручного ведения файла VERSION, если это возможно (или аргументов, почему это невозможно).

PS. Файл VERSION необходим для поддержания зависимости от пакета и определения состояния источника продукта по отзывам пользователей.

PSS. ближайший тег к данной ревизии термин может выглядеть нечетко, но каждый разработчик может сказать, с какой версией продукта он работает. Почему это не может сделать машина?

Ответы [ 5 ]

5 голосов
/ 15 ноября 2011

Вы можете использовать что-то вроде этого:

hg log --template "{latesttag}-{latesttagdistance}-{node|short}\n" --rev <REV>

, который возвращает строку вроде:

2.1.4-2-12eeab7a8073

Это говорит нам о том, что:

  • Самый последний тег перед этим коммитом был 2.1.4
  • Текущая ревизия через 2 коммита после этого тега
  • Идентификатор набора изменений: 12eeab7a8073

Подробнее о шаблонах .

Git имеет встроенную команду describe, которая предоставляет ту же информацию. Однако вы должны понимать, что по умолчанию он работает только с аннотированными тегами (подробности см. На странице man).

3 голосов
/ 15 ноября 2011

bzr tags --sort=time | tail -n1 | cut -d ' ' -f1

Адаптировано из ответа dOxxx.Я видел, что теги обычно сортируются по имени, но могут быть отсортированы по времени с аргументом.

Вы даже можете создать внешний псевдоним bzr, используя плагин extcommand.bzr branch http://bzr.oxygene.sk/bzr-plugins/extcommand/ ~/.bazaar/plugins

Затем вы можете добавить следующее к ~/.bazaar/bazaar.conf

[EXTERNAL_ALIASES]
last-tag = bzr tags --sort=time | tail -n1 | cut -d ' ' -f1

Затем вы можете сделать:

$bzr last-tag
v0.9.0-SNAPSHOT
2 голосов
/ 15 ноября 2011

Git имеет команду, которая специально предназначена для этого: git-describe.Как именно его использовать, зависит от ваших потребностей, но в общем случае git describe [opts] <commit> производит что-то вроде <tag>-<n-commits>-<short-hash>, сообщая вам самый последний тег, сколько коммитов было сделано с тех пор, и сокращенный хеш коммита.Например, он может дать вам v1.7.8-rc0-32-g87bf9a7.

Соответствующие параметры:

  • --tags - включить все теги, а не только аннотированные теги.Вы, вероятно, захотите это.
  • --match <pattern> - включайте только теги, соответствующие данному шаблону, так что вы можете ограничиться тегами версий, а не чем-то посторонним.
  • --abrev=<n> - используйте nцифры хэша (установите 0, чтобы подавить его)

и еще несколько - см. справочную страницу.

Что касается вашего файла VERSION: вы, как правило, не должны его отслеживать.Необходимость вносить изменения в него самоубийственно;коммит содержит файл, и поэтому версия (немного) изменяется, когда вы изменяете его и фиксируете.Вместо этого вы можете автоматически сгенерировать его как часть процесса сборки / развертывания, а также включить его в исходные дистрибутивы.Вы можете обратиться к источнику Git за хорошим примером этого - есть скрипт GIT-VERSION-GEN , который вызывается Makefile и по сути является легкой оболочкой для git-description.Он создает файл версии, который затем упаковывается в исходные архивы, и содержимое которого используется остальной частью процесса сборки, чтобы запечатать номер версии во время компиляции.

2 голосов
/ 15 ноября 2011

Вы смотрели на git describe для мерзавца? Он покажет самый последний тег, доступный из коммита.

1 голос
/ 15 ноября 2011

bzr tags перечисляет теги (и соответствующие им ревизии) в текущей ветке.Я считаю, что самый последний тег указан первым, поэтому вы можете сделать что-то вроде этого:

bzr tags | head -n1 | cut -d ' ' -f1
...