Как предотвратить заезд на нечистое удаленное рабочее дерево - PullRequest
1 голос
/ 01 февраля 2012

Я хочу настроить git на несколько необычный вариант использования.

У меня есть сервер репозитория («repo»), и у меня есть сервер разработки («развернуть»), на котором я хочу выполнить развертывание. На сервере репо у меня есть пустое хранилище («origin»), в которое я отправляю свои изменения из локального клона.

Когда я отправляю ветку, называемую «разработка», на сервер репо, у меня появляется ловушка после получения, которая толкает ветку на сервер разработки:

#!/bin/bash

# post-receive on repo server

while read oldrev newrev ref
  do
  branch=`echo $ref | cut -d/ -f3`

  if [ "development" == "$branch" ]; then
    git push develop development
    echo 'Changes pushed to development server.'
  fi
done

exit 0;

На сервере разработки у меня есть хук после получения, который читает

#!/bin/bash
GIT_WORK_TREE=/srv/www/htdocs/develop git checkout -f

На сервере разработки может случиться так, что кто-то внес изменения непосредственно в рабочее дерево, которое находится в / srv / www / htdocs /velop, без использования git (да, я знаю, не спрашивайте ...).

Теперь: каков наилучший способ предотвращения проверки на сервере разработки, которая могла бы уничтожить не-гиттерские модификации?

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

Было бы здорово, если бы я сделал

$ git push origin development

и git ответил бы так:

Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 706 bytes, done.
Total 9 (delta 3), reused 0 (delta 0)
remote: Unclean working directory on development server. Please fix that first.
To git@repo:development
 ! [remote rejected] development -> development (pre-receive hook declined)
error: failed to push some refs to git@repo:development'

1 Ответ

0 голосов
/ 03 февраля 2012

Я использую упомянутый здесь «официальный» post-update крюк: https://stackoverflow.com/a/3838796/3408 чтобы предотвратить обновление удаленной проверки после нажатия.

Я взял некоторый код из этого кода для инициализации среды и создал скрипт для запуска git diff --exit-code --stat в ловушке перед получением. --exit-code означает, что при наличии различий в толчке будет отказано.

#!/bin/bash

is_bare=$(git config --get --bool core.bare)

if [ -z "$is_bare" ]
then
    # for compatibility's sake, guess
    git_dir_full=$(cd $GIT_DIR; pwd)
    case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi

if [ "$is_bare" = "false" ]
then
    active_branch=`git symbolic-ref HEAD`
    export GIT_DIR=$(cd $GIT_DIR; pwd)
    GIT_WORK_TREE=${GIT_WORK_TREE-..}
    while read oldrev newrev ref
    do
        if [ "$ref" = "$active_branch" ]
        then
            (cd $GIT_WORK_TREE; git diff --exit-code --stat >&2)
        fi
    done
fi

Я только что заработал, это только в основном проверено. Другие могут комментировать, если это можно упростить или улучшить.

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