Вопрос

У меня есть несколько приложений Rails, и я использую GIT в качестве системы управления версиями. Я использую либо GitHub, либо в бобах в качестве хозяев репозитория.

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

Я могу представить, что есть два метода, чтобы справиться с этим. Первым было бы возможной особенностью GIT, которая позволяет вывести вывод идентификатора коммита. Вторым будет пост-коммитный веб-крючок (как Beanstalk, так и GitHub позволяют это).

Кто -нибудь когда -нибудь нашел способ сделать это или что -то подобное?

Спасибо,

Дэнни

Это было полезно?

Решение

Во -первых, разъяснение: post-commit Крюк не может добавить идентификатор Commity в файл в Коммит, потому что идентификатор коммита зависит от фиксации верхнего дерева (представляющий верхний каталог), идентификатор верхнего дерева, в свою очередь, зависит от идентификаторов его членов, а идентификатор файла зависит от его содержимого ... и этот контент должен включать Commit Id. Невозможно.

Но давайте посмотрим на разные решения:

Живые, серверные сценарии

Если ваше веб-приложение развернуто в прямом эфире из репозитория GIT, не имеющего BARE (я надеюсь, что вы знаете, что делаете WRT. Наталкивание в репозиторий, не связанный с BARE, т.е. репозиторий с помощью проверки / рабочего дерева), то ваше веб-приложение может проверить Head, используя, используя Head, используя Head, используя Head, используя Head, используя Head, используя Head, используя Head, используя Head, используя Head, используя Head, используя Head git rev-parse HEAD (дает SHA-1 Commit) или лучше 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 Commits после того, как Commit Tagged 'v1.7.3.2'), но это зависит от того, что вы выпускаете выбросы с использованием аннотированных тегов.

Вариантом этого было бы иметь веб -приложение для проверки Head из репозитория, который находится где -то еще в той же файловой системе, например, с git --git-dir=/path/to/.git describe HEAD.

Примечание: Если вы используете Ruby, вы, вероятно, хотите использовать зернистый библиотека. Эквивалент git rev-parse HEAD Версия, вероятно, была бы (непроверенная!):

require 'grit'
include Grit

repo = Repo.new("/var/git/app.git")
head = repo.commits('HEAD', 1)

app_version = head.id


Live, статические файлы, обслуживаемые из GIT Checkout

Редактировать: Раздел добавлен 2010-10-23 13:33 +0000
Если вы обслуживаете свои файлы из Checkout (Worktree) из репозитория не-баров GIT (не ваша ситуация), вы можете использовать «Smudge» и «Clean» команды filter gitattribute Чтобы выполнить CVS-подобное расширение ключевых слов при оформлении / проверке.

В .gitattributes Файл вы бы определили файлы, на которых filter Атрибут должен действовать:

*.rb filter=commitid

Вы определяете фильтр в файле конфигурации GIT (например, в .git/config), Например

[filter "commitid"]
        smudge = sed -e "s/\$Revision: ?\$/\$Revision: $(git rev-parse HEAD)\$/1"
        clean =  sed -e "s/\$Revision: ?[^$]*\$/\$Revision: \$/1"

А smudge Фильтр заменит «$ revision: $» на EG '$ Revision: V1.7.3.2-95-G7611062' при оформлении (это означает, что проверенные Outfiles будут содержать это CVS-подобное ключевое слово расширено). А clean Фильтр удалит расширение при хранении содержимого файла в базе данных объектов GIT (в репозитории GIT); В противном случае у вас будут проблемы с сравнением файла и т. Д.


Развернуто с использованием git archive

Если вы вместо этого развертываете свое веб -приложение, поэтому оно не находится в репозитории в прямом эфире (у которого есть свои причуды. git archive Где -то (например, приложение ZIP, чтобы загрузить его на свой сайт хостинга), вы можете использовать Замена ключевого слова.

Сначала вам нужно сказать GIT, что вы хотите ключевые слова в файле, замененном на git archive. Анкет Вы делаете это, настроив export-subst для данного файла, например, добавлением в .gitattributes файл

*.rb export-subst

а затем добавление в ваш файл, который содержит/генерирует нижний колонтитул страницы, например,

$Format:%H$

который будет заменен хэшем коммита (см. Описание довольно форматов, например, в git-log Работа).


Развернуто, используя сценарий развертывания

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

Вы должны были бы спросить кого -нибудь еще, как установить Капистрано (При условии, что вы используете его для развертывания) для публикации: развертывание замените '@@ version @@' Заполнитель в вашем файле «app.rb 'с результатом git describe --always HEAD... git project makefile Использование sed для этого.

Другие советы

Я считаю, что вы захотите сделать, это часть вашего «сборка» (развертывание, ваше дело?) git rev-parse HEAD или же git describe HEAD (Лучше, предполагая, что вы тегили) в файле. Ваше приложение может затем отобразить содержимое файла. Хэш коммита не может быть частью какого -либо отслеживаемого контента (хэш коммита зависит от отслеживаемого контента). Конечно, если в вашем приложении заканчивается репо, вы можете просто запустить команду из приложения, но гораздо более элегантно сделать это один раз.

Кстати, это подход, принятый самим GIT. Оно имеет Teeny Shell Script который в основном сбрасывает git describe вывод до GIT-VERSION-FILE, который затем составлен, чтобы предоставить информацию о версии.

Надеюсь, я не неправильно понял вашу ситуацию - я немного смущен вами, говоря «возможной особенностью GIT, которая позволяет вывозить идентификатор коммита». Это очень основная способность GIT.

Во -первых, ответ на ваш вопрос, запустите следующую команду в своем сценарии Ruby:

`git log -n1 | head -1`.split.last

Второе: что вы имеете в виду, что используете Beanstalk в качестве хоста репозитория? Разве Beanstalk не сервер очереди?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top