Git hook для обновления различных веб-папок на основе ветки, отправленной на удаленный сервер - PullRequest
2 голосов
/ 20 марта 2011

Я занимаюсь разработкой веб-приложения с использованием Gitosis (Debian Lenny), которое я хочу использовать в различных удаленных репозиториях / хранилищах, что позволяет использовать «передовые», «релиз-кандидаты» и «производственные» версии приложение с зеркальными физическими веб-каталогами и кодовой базой. Я бы предпочел, чтобы в каждом каталоге была ветвь приложения. Итак, один репозиторий, три «живых» версии.

Я новичок в Git, так что, возможно, есть лучшее решение, но я дошел до того, что нашел способ прикрепить хуки к ветвям (которых я не нашел) или написать хук, который будет фильтр, для которого ветвь фиксируется.

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

git rev-list --branches --pretty=oneline --max-count=1

вернет что-то вроде:

cc5112ba59bc82f2e847ac264317c062ce80f69f test commit

но мне нужно название самой ветви, например, "экспериментальный" или "мастер".

Так что в основном я ищу что-то вроде:

1) Получить имя только что зафиксированной ветви (например, "master", "экспериментальный") в строку

2) Используйте Bash case, чтобы объявить, какой каталог использовать

3) Запустите что-то вроде «git archive --format = tar HEAD | (cd $ LOCATION && tar xf -)», где location - это то, что было возвращено из case.

Я подумал, что подхожу ближе к следующему, но понял, что оно не возвращает имя ветки, а вместо этого сообщение фиксации:

#!/bin/sh

# Get substr from "sha1[space]commit-msg"
BRANCH=$(git rev-list --pretty=oneline --branches --max-count=1 | awk '{split($0,array," ")} END{print array[2]}')
case $BRANCH in
    "experimental")
        dir="/home/APP_NAME/experimental"
    ;;
    "master")
        dir="/home/APP_NAME/production"
    ;;
esac
# move to location and copy files
git archive --format=tar HEAD | (cd $loc && tar xf -)

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

Любая помощь будет принята с благодарностью. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 20 марта 2011

Возможно, я что-то упустил, но если это в хуке post-update, то вы получите имена ссылок, которые обновляются в качестве параметров для хука. например если мои push-обновления master и experimental в хранилище, то post-update вызывается с:

 post-update refs/heads/master refs/heads/experimental

... и вы можете получить к ним доступ с помощью $1 как $2, как обычно в вашем скрипте хука.

Кстати, в документации githooks указано, что вы можете рассмотреть возможность использования вместо этого ловушки post-receive, которая вместо этого получает информацию о стандартном вводе - однако она также дает вам старые и новые значения ссылка и имя ссылки, которая может быть полезна.

0 голосов
/ 20 марта 2011

Если вы подтолкнете к репо non-bare (что не рекомендуется, но может работать с этим ловушкой после обновления ), вы можете завершить эту ловушку, зная, что:

git symbolic-ref HEAD
# or
git rev-parse HEAD

Дайте вам имя текущей ветви, в то время как $ref представляет перемещаемую ветвь.
Затем вы можете обновить три различных рабочих дерева, каждое из которых уже установлено в правой ветви.

...