Во-первых, уточнение: post-commit
ловушка не может добавить идентификатор коммита в файл в коммите, потому что идентификатор коммита зависит от фиксации верхнего дерева (представляющего верхний каталог), идентификатора верхнего дерева вочередь зависит от идентификаторов его членов, а идентификатор файла зависит от его содержимого ... и этот контент должен включать в себя идентификатор фиксации.Невозможно.
Но давайте рассмотрим различные решения:
Live, серверные сценарии
Если ваше веб-приложение развернуто в реальном времени из не-голого репозитория git (янадеюсь, что вы знаете, что вы делаете, не обращаясь к непокрытому репозиторию, т.е. к репозиторию с извлеченным / рабочим деревом), тогда ваше веб-приложение может проверить HEAD, используя git rev-parse HEAD
(дает SHA-1 коммита), или лучше git describe --dirty
(опция --dirty
заставит возвращаемую строку содержать информацию о том, есть ли у вас несвязанные изменения в рабочей области), или git describe --always HEAD
.
git rev-parse HEAD
даетчто-то вроде 7611062b4ba6d1ebc4cf3e63c11204a4f5057660
, тогда как git describe --dirty
дает что-то вроде v1.7.3.2-95-g7611062
(что означает коммит с сокращенным SHA-1 из 7611062
, 95 коммитов после коммита с тегом 'v1.7.3.2'), но это зависит от того, что вы пометиливыпуски с использованием аннотированных тегов.
Вариантом этого может быть наличие веб-приложения для проверки HEAD из хранилища, которое находится где-то еще в той же файловой системе, например, с git --git-dir=/path/to/.git describe HEAD
.
Sidenote: если вы используете Ruby,Вы, вероятно, хотите использовать библиотеку grit .Эквивалент git rev-parse HEAD
версии, вероятно, будет (не проверен!):
require 'grit'
include Grit
repo = Repo.new("/var/git/app.git")
head = repo.commits('HEAD', 1)
app_version = head.id
Живые статические файлы, полученные из git checkout
Редактировать: добавлен раздел 2010-10-23 13:33 + 0000
Если вы обслуживаете свои файлы из извлечения (рабочего дерева) из не-пустого хранилища git (невашей ситуации), вы можете использовать команды smudge и clean из filter
gitattribute для выполнения CVS-подобного расширения ключевых слов при извлечении / регистрации.
В файле .gitattributes
вы определяете файлы, для которых должен действовать атрибут filter
:
*.rb filter=commitid
Вы определяете фильтр в файле git config (например, в .git/config
), например,
[filter "commitid"]
smudge = sed -e "s/\$Revision: ?\$/\$Revision: $(git rev-parse HEAD)\$/1"
clean = sed -e "s/\$Revision: ?[^$]*\$/\$Revision: \$/1"
Фильтр smudge
заменит '$ Revision: $' на, например, '$ Revision: v1.7.3.2-95-g7611062' при оформлении заказа (это означает, что в проверенных выходных файлах это ключевое слово типа CVS будет расширено).Фильтр clean
удалит расширение при хранении содержимого файла в базе данных объектов git (в репозитории git);в противном случае у вас возникли бы проблемы со сравнением файла и т. д.
Развертывание с использованием git archive
Если вместо этого вы развернете свое веб-приложение, оно не будетНе находясь в живом репозитории (который имеет свои особенности по отношению к нему и имеет возможные недостатки безопасности), и вы используете git archive
где-то (например, чтобы заархивировать приложение, чтобы загрузить его на ваш хостинг-сайт), вы можете использовать подстановка ключевых слов .
Сначала вы должны сказать Git, что вы хотите, чтобы ключевые слова в файле были заменены на git archive
.Вы делаете это, устанавливая export-subst
для данного файла, например, добавляя к .gitattributes
file
*.rb export-subst
, а затем добавляя в свой файл, который содержит / генерирует нижний колонтитул страницы, например,
$Format:%H$
, который будет заменен хэшем коммита (см. Описание симпатичных форматов, например, в git-log manpage).
Развернуто с использованием некоторого сценария развертывания
Если вы используете какой-либо сценарий / механизм сценариев для развертывания веб-приложения, вы должны следовать совету Jefromi , чтобы ваш сценарий развертывания встраивал информацию о версии.
Вы бынужно попросить кого-нибудь еще, как установить Capistrano (при условии, что вы используете его для развертывания), чтобы опубликовать: развертывание замените '@@ VERSION @@' местозаполнителем в вашем файле 'app.rb' с результатом git describe --always HEAD
... Git проекта Makefile использует sed
для этого .