Использование git в качестве инструмента развертывания - PullRequest
2 голосов
/ 21 июня 2011

Я пытаюсь использовать git в качестве инструмента развертывания, поэтому, когда произошел переход в производственную ветвь, я хочу соответствующим образом обновить удаленный сервер. Однако, когда я запускаю вторую команду (тягу), она возвращается с ошибкой, которая говорит Operation must be run in a work tree. Может ли кто-нибудь указать мне правильное направление?

Вот частичный пример скрипта bash.

echo -e "Thank you for pushing your changes to ${project}. \nHold on while I update the required directories..."
GIT_WORK_TREE=/home/www/${project} git checkout -f
echo "Local directory updated!"

for ref in $@; do
    echo $ref
    if [ "$ref" = "refs/heads/production" ]; then
        # Before we could set the GIT directory strictly from the local environment
        # but the case might not be the same remotely. Need absolute paths.
        ssh git@myserver GIT_DIR=/home/www/${project}/.git GIT_WORK_TREE=/home/www/${project} git checkout -f production
        ssh git@myserver.com GIT_DIR=/home/www/${project}/.git GIT_WORK_TREE=/home/www/${project} git pull -f production
        echo "Production push completed"
    fi
done

РЕДАКТИРОВАТЬ:

Вот ошибка вставленной копии:

remote: fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Как сказал @meagar, похоже, что клонированный репозиторий на удаленном сервере был клонирован с опцией --bare. Клонируйте его снова без этой опции, чтобы получить нормальную копию «рабочего каталога», как у вас локально.

Итак, теперь вы должны иметь:

  • ваш локальный репозиторий
  • пустой репозиторий на сервере
  • обычный на сервере (клонированный с нуля)

Имея это в виду, теперь вы можете создать ловушку после получения, которая запускается всякий раз, когда что-то помещается в пустой репозиторий. Хуки живут (на сервере) в папке хуков простого репо (там есть примеры для различных случаев).

#!/bin/bash
while read oldrev newrev refname
do
    if [ "$refname" == "refs/heads/master" ]; then
        WORKDIR=/path/to/checked/out/repository
        export GIT_DIR=$WORKDIR/.git
        pushd $WORKDIR >/dev/null
        git pull --quiet >/dev/null
        # run some scripts in the checked out repository
        popd >/dev/null
    fi
done

Этот скрипт специально ищет толчок к основной ветке, но его можно легко изменить на другую ветку или полностью удалить. Затем он переключается на рабочий каталог вашего извлеченного репозитория и выполняет извлечение. После завершения загрузки вы можете запускать любые другие полезные команды bash.

1 голос
/ 21 июня 2011

Похоже, что хранилище, которое вы считаете "развернутым", является пустым хранилищем.Вам следует клонировать репо без --bare и повторить попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...