Как я могу переписать python __version__ с помощью git? - PullRequest
42 голосов
/ 07 апреля 2011

Я хотел бы определить переменную __version__ в моем модуле, которая должна автоматически обновляться при git commit, аналогично тому, что делают ключевые слова SVN . Есть ли способ добиться этого в Git? У кого-нибудь есть рабочий пример?

Я подумал об использовании GitPython , но я не хотел бы вводить другую зависимость, и я хочу, чтобы пользователи, которые скачивают модуль из репозитория SVN или в виде zip-пакета, имели ту же схему управления версиями (мне все равно это какой-то неразборчивый хеш).

Редактировать: Моя конкретная проблема заключается в том, что мне нужно запускать симуляции, результаты которых зависят от точной версии скрипта симуляции. Поэтому каждый раз мне приходится хранить номер версии вместе с результатами моделирования. Если оба варианта не синхронизированы, это может привести к очень тяжелым последствиям.

Ответы [ 3 ]

31 голосов
/ 07 апреля 2011

Может быть лучше сделать это как часть вашей упаковки, а не после каждого коммита.

Существует два основных варианта:

  • Используйте git-archive для упаковки и используйте атрибут export-subst . К сожалению, вещи, которые вы можете заменить, ограничены заполнителями из git log --format=.... Например, вы можете написать __version__ = $Format:%H$ в своем файле, поместить <filename> export-subst в свои .gitattributes, и когда вы запустите git archive, это изменится на полный хэш коммита, с которым вы архивируете. Это примерно то, что вы просите, но я предпочитаю следующий вариант.

  • Сделайте это самостоятельно как часть процесса упаковки (часто это процесс сборки для скомпилированных пакетов) и используйте git describe. Это даст вам симпатичную красивую строку, такую ​​как v1.7.4.1-59-ge3d3f7d, что означает «59 коммитов после тега v1.7.4.1, при коммите ge3d3f7d», которые затем можно вставить как угодно в нужное место в вашем коде при сборке / сборке. Это то, что делает сам Git; результат выгружается в файл, содержимое которого считывается в make-файл, а затем передается в сборку с помощью опции препроцессора -D и помещается в различные имена файлов (например, tar-архив выпуска).

Если вы действительно, действительно хотите делать это после каждого коммита, вы можете это сделать с помощью хука после коммита, но тогда только у вас (и у тех, кому вы даете хук) это будет, и очень очень возможно получить несинхронно - вам также понадобится хук после оформления заказа, и так далее, и так далее. Действительно лучше для любых процессов, которые создают что-то, нуждающееся в этом номере версии, чтобы получить это сами.

Вы также можете использовать грязный / чистый фильтр, который будет больше похож на то, что вы действительно хотите (а не просто после каждого коммита).

5 голосов
/ 22 декабря 2018

Для тех, кто найдет этот вопрос в 2018 году, вы также можете использовать Versioneer . После включения он автоматически устанавливает version в setup.py и __version__ в вашем модуле на основе последнего тега Git во время сборки.

Например, если вы строите свой проект по тегу 1.0.0, Versioneer установит версию проекта на 1.0.0. Если вы сделаете еще два коммита, отредактируете некоторые без регистрации и соберете, Versioneer установит для версии что-то вроде 1.0.0+2.g1076c97.dirty.

Конечно, вы можете настроить, какие теги Versioneer распознает как теги версии.

Это также, как крупные проекты, такие как pandas и matplotlib обрабатывают свои версии.

0 голосов
/ 11 июля 2019

Другая возможность, кроме Versioneer, - setuptools_scm.

Я успешно реализовал нечто очень похожее на ОП, добавив следующее к setup.py (или изменив его соответствующим образом):

from setuptools import setup
setup(
    ...,
    use_scm_version=True,
    setup_requires=['setuptools_scm'],
    ...,
)

и для автоматического обновления __version__ добавьте это в __init__.py моего пакета:

from pkg_resources import get_distribution, DistributionNotFound
try:
    __version__ = get_distribution(__name__).version
except DistributionNotFound:
    # package is not installed
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...