Автоматическое добавление версии в исходники (не обязательно Python) - GIT hook

Задача

Удобно всегда знать точную версию приложения, с которым ты имеешь дело.

Когда речь о передаче приложения по цепочке разработки (в отдел тестирования, на демо и продуктовую площадки) всегда есть точная версия. Но ее ставят руками в том или ином виде (например, как git tag в ветке релизов).

Когда речь идет о внутреннем сервере разработке, или собранной вами для отладки версии приложения, нереально не забывать каждый раз менять версию.

Чтобы версия проставлялась автоматически можно использовать git hooks. Это скрипты, работающие локально на вашем компьютере. Они вызываются из git при соотвествующих событиях, например, перед комитом.

Показанный ниже скрипт (назовите его git_hook_add_commit_date.sh) сохраняет в файл дату и время последнего комита и добавляет этот файл в комит.

#!/usr/bin/env bash
FILE=build_timestamp
date "+%F %T" > "$FILE"
git add "$FILE"

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

Ниже пример Python кода, считывающего эту версию из файла.

Далее вы можете использовать ее в вашем приложении, например, чтобы отображать в диалоге О программе или возвращать в вызове API /version.

def version():
    try:
        return open('build_timestamp', 'r').read().strip()
    except:
        return None


if __name__ == '__main__':
    print(version())

Из соображений безопасности эти скрипты (git hooks) никогда не установливаются автоматически при скачивании репозитория, их всегда надо устанавливать явно.

Ниже показан скрипт, устанавливающий показанный выше скрипт как pre-comit git hook.

#!/usr/bin/env bash
if [ ! -f .git/hooks/pre-commit ] ; then
    ln -s $PWD/git_hook_add_commit_date.sh .git/hooks/pre-commit
fi

Еще удобнее было бы добавлять сообщение комита. Но я не нашел способа это сделать.

Сообщение можно получить в git hook commit-msg, но на этой фазе, похоже, GIT уже не разрешает менять файлы в коммите. Я видел много рекомендаций делать git commit --amend но у меня после этого гит аварийно завершает комит с сообщением о том что изменился HEAD.

Если кто-то знает способ, работающий с современными версиями GIT, напишите мне пожалуйста.

Опубликовано December 22, 2018