Как найти самый последний тег для текущей ревизии в Git/HG / Bzr?
В настоящее время в моей практике я использую файл версии для хранения:
major=2 minor=0 fix=1
Что означает, что исходники для продукта версии v2. 0. 1 или новее.
Перед каждым релизом я должен фиксировать обновление этого файла, поэтому тег с именем tag2. 0. 1 или release-2.0.1 покрывает содержимое выше (а не предыдущую версию!).
Я думаю, что можно избежать этой задачи, автоматически генерируя файл версии из сценария сборки.
Посмотрите на историю rev:
+--+-----+----------------------+-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, в точке YY версия является 1.0.2, в точке ZZ версия является 2.0.1.
Для точки HH - это не знаю, как установить версию. Я думаю, что так и должно быть.1.0.2, потому что мы не сливаем ветвь dev с ветвью release b2.
Я читаю:
$ hg help revsets
Но не вижу, как я могу найти ближайший тег к данной ревизии. С Git и Bzr у меня меньше опыта...
Или если это s невозможно я ищу аргументы. Также я хотел бы услышать, как избежать вручную поддерживать файл версии, если это возможно (или аргументы, почему это невозможно).
ПС.Файл версии, необходимый для поддержания зависимости пакета и идентификации исходного состояния продукта в отзывах пользователей.
ПСС. ближайший тег к данному термину ревизии может выглядеть как-то нечетко, но каждый разработчик может сказать, на какой версии продукта он работает. Почему этого не может сделать машина?
5 ответов:
Вы могли бы использовать что-то вроде этого:
hg log --template "{latesttag}-{latesttagdistance}-{node|short}\n" --rev <REV>
, который возвращает строку типа:
2.1.4-2-12eeab7a8073
Это говорит нам о том, что:
- самый последний тег перед этим коммитом был 2.1.4
- текущая ревизия - это 2 коммита мимо этого тега
- идентификатор набора изменений-12eeab7a8073
Прочитайте о шаблонах для получения дополнительной информации.
Git
имеет встроенныйdescribe
команда, которая обеспечивает то же самое информация. Однако вы должны понимать, что по умолчанию он работает только с аннотированными тегами (Подробнее см. man-страницу).
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
Вы смотрели на
git describe
для мерзавца? Он покажет самый последний тег, который доступен из фиксации.
У 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, чтобы подавить его)И еще несколько - смотрите manpage.
Что касается вашего файла версии: вы обычно не должны отслеживать его. Необходимость вносить в него изменения обречена на провал; фиксация содержит файл, и поэтому версия (слегка) изменяется, когда вы изменяете ее и фиксируете. Вместо этого вы можете автоматически сгенерировать его как часть процесса сборки / развертывания,а также включить его в исходные дистрибутивы. Вы можете посмотреть на источник Git для хорошего примера этого-есть скрипт под названием GIT-VERSION-GEN , который вызывается файлом Makefile и по сути является легкой оболочкой вокруг git-descript. Он создает файл версии, который затем упаковывается в исходные тарболы, и содержимое которого используется остальной частью процесса сборки, чтобы записать номер версии во время компиляции.