Подтвердить что ты не робот

Как сохранить номер версии моего bash script, который находится под управлением git?

Я только что закончил первую рабочую версию более сложного bash script, и я оборачиваюсь вокруг того, как поддерживать версию скриптов.

Зачем мне это нужно? После Стандарты кодирования GNU для интерфейсов командной строки Я добавил вариант версии, который среди заголовка лицензии и авторского права отображает текущую версию.

Тем не менее, я не знаю, как сохранить версию "актуальной".

Моя идея до сих пор заключается в использовании тегов git для major | минор | релиз патчей и каким-то образом заменить переменную, содержащуюся в script.

Итак, если у меня есть тег с именем 1.1.0, то

$ myscript --version

Должно вывести что-то вроде:

myscript 1.1.0

script содержит для этого переменную оболочки:

version=1.1.0

Тем не менее, я не понимаю, как синхронизировать версию с последним тегом?

ИЗМЕНИТЬ

Поймите этот слегка запутанный вопрос...

4b9b3361

Ответ 1

Насколько я могу судить, то, что вы хотите, невозможно. Чтобы иметь номер версии в программном обеспечении для управления версиями, вам нужно будет отредактировать номер версии, зафиксировать, затем пометить тег; А не наоборот. Однако вы можете немного упростить процесс.

Мы можем сделать это, написав крюк после фиксации, который будет читать ваш номер версии script, и если он изменился с последнего раза, выпишите новый тег. Чтобы сделать это, cd в .git/hooks из каталога проекта, создайте файл с именем post-commit (или переместите post-commit.sample) и сделайте его исполняемым. Затем отредактируйте его так, чтобы он выглядел примерно так:

#!/bin/bash

NEWEST_TAG=$(git describe --abbrev=0 --tags)

SCRIPT_VERSION=$(grep "^version=" myscript | awk -F= '{print $2}')

if [ x$NEWEST_TAG != x$SCRIPT_VERSION ]; then
    git tag -a $SCRIPT_VERSION -m "version $SCRIPT_VERSION"
fi

В следующий раз, когда вы присвоите номер версии script и скопируйте свои изменения, вы увидите новый тег, добавленный к вашему последнему фиксации.

Ответ 2

Ответы на крючок, ранее заданные, тесно связаны с синхронизацией строки версии с git commit; однако кажется, что вы хотите, чтобы он работал наоборот, то есть версия извлекалась из созданных вручную метаданных git tag. Оказывается, на самом деле это почти тот подход, который использует git исходный код, поэтому давайте узнаем, как вы могли бы принять что-то подобное, изучив его подход:

  • Он имеет GIT-VERSION-GEN оболочку script, которая пытается разумно определить текущую версию. По сути, он пытается извлечь строку версии через git describe, но возвращается к жестко установленному умолчанию, если это не работает. Версия написана на GIT-VERSION-FILE в начале исходного дерева.
  • Makefile вызывает этот script и include сгенерированный файл:

    GIT-VERSION-FILE: FORCE
            @$(SHELL_PATH) ./GIT-VERSION-GEN
    -include GIT-VERSION-FILE
    

    Теперь версия доступна для остальной части Makefile через $(GIT_VERSION).

  • Различные правила использования, затем используют это для выполнения замещений на любых файлах, которые нуждаются в строковой цепочке версии, например, в различных сценариях Perl:

    $(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl GIT-VERSION-FILE
            $(QUIET_GEN)$(RM) [email protected] [email protected]+ && \
            INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \
            sed -e '1{' \
                [... snipped other substitutions ...]
                -e 's/@@[email protected]@/$(GIT_VERSION)/g' \
                [email protected] >[email protected]+ && \
            chmod +x [email protected]+ && \
            mv [email protected]+ [email protected]
    

    Например, если вы посмотрите в начале git-svn.perl, вы увидите:

    $VERSION = '@@[email protected]@';
    

В моем исходном дереве это правило скомпилировано в файл git-svn, который содержит строку:

    $VERSION = '1.7.11.rc0.55.gb2478aa';

поэтому, если я проверяю версию локально скомпилированного git-svn, я вижу:

    $ git svn --version
    git-svn version 1.7.11.rc0.55.gb2478aa (svn 1.6.17)

тогда как если я запустил установку на основе rpm, я вижу:

    $ /usr/bin/git svn --version
    git-svn version 1.7.6.5 (svn 1.6.17)

Этот последний вывод демонстрирует, что подход работает даже тогда, когда исходный код компилируется из выпущенного tarball, который не содержит метаданных управления версиями в подкаталоге .git/. Это означает, что строка версии прекрасно отличает стабильные версии и моментальные снимки разработки.

Хотя git-svn является Perl script, очевидно, что тот же подход подстановки будет отлично работать для вашей оболочки - script.

Ответ 3

Вместо того, чтобы создавать тег самостоятельно, используйте крюк post-commit. Идея состоит в том, чтобы проверить, содержит ли HEAD строку, изменяющую назначение версии, и если да, создайте новый тег. Это всего лишь примерный пример; это может быть ошибкой, и это определенно не так эффективно, как могло бы быть.

#!/bin/bash

before=$( git log HEAD | awk -F= '/-version=/ {print $1}' )
after=$( git log HEAD | awk -F= '/+version=/ {print $1}' )

if [[ $before != $after ]]; then
    git tag myscript-$after
fi

Ответ 4

Тем не менее, я не знаю, как сохранить версию "актуальной".

Мне нравятся рекомендации по поднятию крючка. Однако, альтернативный подход, вы также можете использовать систему сборки, если у вас уже есть один доступный. У вас есть автоматическая система сборки? Дженкинс или Бамбук? Наша система сборки создает новый тег для каждой успешной сборки, проходящей все модульные тесты. Предоставлено это script, поэтому вам может потребоваться только запустить модульные тесты, если они у вас есть. Вы можете добавить задание в задание сборки, чтобы увеличить или сопоставить версию с тегом успешной сборки или последней фиксации, которая запускает и передает любые тесты.