Git ключевое слово-расширение или альтернатива
Прочитав некоторые сообщения здесь на эту тему, я понимаю, что есть довольно много минусов, которые говорят против использования подстановки ключевых слов. Тем не менее, мне нужен способ решения следующей проблемы, и я надеюсь, что у кого-то может быть идея, как решить эту проблему с помощью git (независимо от того, используется ли подстановка ключевых слов):
У меня есть основное приложение, для которого я использую git в качестве VCS. Части этого основного приложения (определенный набор XML-файлов) используются утилитой, для которой я также использую git (отдельный репозиторий).
Теперь основное приложение и утилита имеют разные циклы выпуска, и всякий раз, когда я выпускаю новую версию утилиты, я копирую самый последний набор XML-файлов из основного приложения. Внутри утилиты этот набор XML-файлов является не версионным контентом в git, поэтому он даже не зарегистрирован в репо.
На данный момент, когда я смотрю на разные выпуски этой утилиты (которая управляется git и имеет помеченные выпуски), у меня нет возможности узнать, на какую "версию" (лучше: commit hash) ссылается набор содержащихся XML-файлов.,
Поэтому я подумал: если я смогу иметь последний коммит SHA в этих XML-файлах (в качестве комментария), я всегда буду знать, к какому набору XML-файлов относится определенная версия моей утилиты. Есть ли что-то не так в этом подходе или это путь? Если да, как мне вставить последний коммит-SHA в мои XML-файлы? (Я читал, что $Id:$ не будет принимать коммит-SHA, но какой-то "блоб"-SHA?)
4 ответа
Хорошо, ребята, основываясь на вашем мнении, вот что я сделал:
- Вставьте заполнители в мои XML-файлы:
<!-- @GIT_VERSION@ -->
- Пусть Ant заберет информацию о версии git, обратите внимание, что это Windows:
- Пусть муравей вставит эту информацию в мои XML-файлы, копируя их.
Код:
<target name="getGitDetails">
<exec executable="cmd" outputproperty="git.revision">
<arg value="/c" />
<arg value="git.cmd --git-dir=<path-to-repo> describe --long --dirty --always" />
</exec>
<exec executable="cmd" outputproperty="git.currentBranchRef">
<arg value="/c" />
<arg value="git.cmd --git-dir=<path-to-repo> describe --all" />
</exec>
</target>
<target name="build" depends="getGitDetails">
<copy todir="<dest-dir>">
<filterset>
<filter token="GIT_VERSION" value="${git.currentBranchRef} ${git.revision}" />
</filterset>
</copy>
</target>
Спасибо за вашу помощь!
Смотрите также:
Как найти последний хеш git commit из скрипта сборки ant
Извлечение версии сборки приложения из `git description` - как получить относительно простую строку?
Два варианта
Использование подмодулей
Вы можете создать основное приложение как репо + подмодуль для XML-данных. Поскольку вы не можете использовать часть git-repo в качестве субмодуля в другом репо, только полное репо (Git-boys, FIXME), вам нужно заново создать утилиту-репо как "супермодуль" и разделить репо на две части - утилита + XML- данные
Основной репо также становится "супермодулем" и будет 1) включать основное приложение и 2) XML-данные для приложения
Поскольку Git поддерживает строгую связь между наборами изменений в основном репо и подмодуле для всех и любого базового идентификатора набора изменений (Git-boys, FIXME), вы можете знать только хэш основного приложения и связываться с этим снимком набора изменений XML-данных.
Грязные фильтры
Сохраняя репо как полностью независимые, вы можете добавлять данные отслеживания в XML-файлы. Правильный способ добавления любого произвольного ключевого слова в данные, контролируемые Git, - фильтры Smudge-clean (см. Раздел "Расширение ключевого слова" и пример расширения ключевого слова $Date$)
Возможное решение - расширить процесс сборки основного приложения, чтобы одним из результатов были упакованные XML-файлы. Эта упакованная версия будет содержать дополнительную информацию о версии основного приложения. Такой пакет будет удобно связывать с внешними утилитами и т. Д.
Во время сборки вы можете получить информацию о версии непосредственно из git git describe
или же git rev-parse HEAD
(см. Добавление текущего идентификатора коммита git в веб-приложение Java)
Если этот файл XML не отслеживается Git, то в этом нет ничего плохого. Я думаю, что это хорошая идея - иметь хэш, на котором основывается сборка, где-то видимым, так что вы всегда будете сейчас, когда что-то появится, на какой версии исходного кода это основано.
Просто для полноты, невозможно иметь хеш-значение в отслеживаемом файле. Это потому, что хеш создается на основе всей информации, которую имеет Git. Если он вставит значение в какой-нибудь отслеживаемый файл, то этот файл будет изменен, и вам нужно будет сделать еще один коммит, или нужно будет изменить предыдущий коммит, что приведет к другому хеш-значению.
Поскольку ваш файл не отслеживается, изменения в нем не изменят значение хэша, поэтому вышеприведенное не является проблемой. Существует несколько способов получения текущего хэша SHA1, самый простой из которых, вероятно, заключается в просмотре .git/refs/heads/master
, Этот файл является указателем на master
ветвь и содержит хэш коммита HEAD в этой ветке. Конечно, вы можете изменить /master
в любую другую ветку, если хотите.