Как стать автором
Обновить

Комментарии 27

А как потом можно найти коммит, имея номер тега и количество коммитов после этого тэга?
Скорее всего никак (или очень затруднительно). История в git — однонаправленный граф, и просто идти «вперёд» по истории не получится.
А зачем? Если так нужно для последующей возможной ловли багов, то проще хранить сразу хэш коммита для этой цели (и показывать его где-нибудь в «О программе»).
Да, для багов и тестирования. Хэш храню и показываю, но числовая версия для пользователей проще и человечнее, чем хэш :)
Вообще, весь список коммитов после тэга можно посмотреть через git log v0.8..master (и git describe именно так высчитывает количество коммитов), но я не уверен, что там не возникнет какая-нибудь неопределенность с порядком коммитов из-за merge команд.
В выводе git describe есть первые несколько символов идентификатора коммита. Собственно, этого будет достаточно.
Идея достаточно хорошая. И всё же, её можно немного расширить для масштабируемости следующим образом:

1. Делим всю работу на бранчи master/develop/feature/hotfix и далее по вкусу, как описано в куче трудов.
2. Если вы привязываетесь к количеству коммитов, то логичным будет всю работу делать в feature-бранчах, и по окончанию этой работы делать git merge --no-ff в develop-ветку.

Результат: это даст увеличение количества коммитов в develop-ветке ровно на один, что будет соотвествовать единице добавленного функционала. То есть в dev-бранче +1 версия = +1 реализованный функционал. Удобно.
В feature-бранче же версия, посчитанная вашим образом, имеет конечный смысл для разработчика. И поэтому даст свободу по количеству коммитов в feature-бранче. Я например часто коммичу, тк стараюсь делать это достаточно атомарно.
Но, к сожалению, неизбежно возникает конфликт версий между dev-веткой и feature-веткой, тк версии считаются одинаково. Поэтому, я бы предложил форматировать версию для feature-ветки как-нибудь так:

Версия 0.8.2-<имя feature-ветки>-<количество коммитов в ней>, где 0.8.2 — версия из dev, от которой пошла feature-ветка. Конечный результат:

0.8.2-new_ui-9

Схема:

Версия 0.8.2|...........-> 0.8.3
Ветка dev -----------------------
Ветка new-ui \........./


Имхо, так лучше.
Не сработает:
mkdir tmp && cd tmp
git init .
# Корневой коммит, он же v1.0
touch a && git add a && git commit -m "0"
git tag -a -m "version 1.0" v1.0
# Переключаемся в ветку devделаем работу в ней
git checkout -b dev
touch b && git add b && git commit -m "1"
# Обратно в мастер
git checkout master
touch c && git add c && git commit -m "2"
# И снова в dev
git checkout dev
touch d && git add d && git commit -m "3"
# А теперь merge
git checkout master
git merge --no-ff dev
# И что в итоге?
git describe

И…

v1.0-4-geafc8e0

Упс, а посчитались-то все коммиты.

После merge'а git уже не может сказать, какой же ветке принадлежал коммит, поэтому считает все. И я не знаю, как git describe'у сказать «а в мёрдж-коммитах следуй по первой ссылке на родителя».
Сорри за некропостинг, но сейчас есть ключик --first-parent.
Наоборот, спасибо вам большое.
НЛО прилетело и опубликовало эту надпись здесь
а кто и зачем собрался держать код вне репозитория?

Например, в src-пакетах всех ведущих дистрибутивов Linux.
Хм, ну там да… Но у меня не модуль, не библиотека и не компонент. Так что исходный код всегда в репозитории. На машине ли разработчика или на сервере, но из под надзора CVS он не уходит ни на минуту.
Вот чем хорош был svn, так вот этим :)
Если вы имеете в виду $Revision, то он бесполезен, так как относится к конкретному файлу, а не ко всему проекту.
Или я вас не понял, или вы что-то путаете.
В svn сквозная нумерация ревизий. Ревизия файла и проекта по сути одно и тоже.
При чем тут svn keywords вообще?
Так чем же по вашему хорош svn в контексте топика? Если не фичей автоматической подстановки ревизии в файлы, тогда чем?
>Не подойдёт для, например, PHP, так как вызывать пару тройку shell-комманд на каждый запрос — накладно.

Вот тут не только проблема в ПХП — зачем выполнять несколько команд при каждом запросе, если можно их собирать только когда это необходимо.

В гите есть замечательный .git/hooks/post-merge хук, в котором можно всю эту инфу единоразово положить в файл version.php (.rb, .py...) и подключать его.

Итого в коде всегда будет актуальная переменная (константа, класс) которая будет содержать эту информацию.

Спасибо за git describe!
НЛО прилетело и опубликовало эту надпись здесь
Ну да, как вариант — использовать хуки… Вот только я не знаю — передаются ли хуки по pull/push, или для каждого клона их придётся прописывать заново?
Так как я всё ещё не определился, хранение номера версии в коде — это зло или благо? Может быть post-merge (или лучше pre-commit) хук, вычисляющий и записывающий номер версии в файл (и добавляющий его в коммит).
Я думаю, что такой вариант будет золотым компромиссом: и версии автоматом ставятся и в коде есть.
Но здесь есть одно НО: при создании тэга потребуется переписать этот и все последующие коммиты (а изменение истории — это совсем нехорошо, если эти коммиты уже ушли на гитхаб или ещё куда в паблик). Но это касается только случая, когда этот файл version.ext включен в репозиторий (не игнорируется).
>Так как я всё ещё не определился, хранение номера версии в коде — это зло или благо?
Так ничто не мешает этот файл добавить в .gitignore ) и не будет лишней мороки с коммитами

Можно написать 1 скрипт который будет «перебивать» версию и подключать его в нужных хуках, в зависимости от своего сценария деплоймента.

А вообще, зачем эта информация нужна на каждой странице? Можно сделать special-url для тестеров… заметят баг — откроют, скопипастят номер версии в тикет и всего то и делов.
Не подойдёт для, например, PHP, так как вызывать пару тройку shell-комманд на каждый запрос — накладно.

Кроме этого, держать директорию .git доступную через веб сервер тоже как то не хорошо.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории