2013-09-29 3 views
2

Я создал голую GIT репозиторий на моем сервере и настроить следующий пост-получить крюк от this blog:Гит после приема Крючок не удаляет удаленные файлы с мастер

#!/bin/bash 

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

    if [ "master" == "$branch" ]; then 
    git --work-tree=/path/to/my/project/live/ checkout -f $branch 
    echo 'Changes pushed live.' 
    fi 

    if [ "develop" == "$branch" ]; then 
    git --work-tree=/path/to/my/project/dev/ checkout -f $branch 
    echo 'Changes pushed to dev.' 
    fi 
done 

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

Я установил правильные права на оба живут в папку Dev:

drwxrwsr-x 2 git git 4096 Sep 29 12:10 live/ 
drwxrwsr-x 2 git git 4096 Sep 29 12:09 dev/ 

И толкая от развивать отрасли работы, как ожидалось. Проблема возникает, когда я проверяю мастер-ветку и делаю слияние. Когда я нажимаю мастер, новые файлы копируются в живую папку на моем сервере, но файлы, которые я удаляю локально, не удаляются.

Как я могу сделать post-receive правильно обновить живую папку? Благодаря!

ответ

3

Проблема в том, что git не знает, что удалить (у него нет указателя в дереве работы, отслеживая такие вещи). Должно быть возможным разрешить это с индексом для каждого рабочего дерева, но я думаю, что проще просто git checkout -f в новый пустой каталог, а затем переименуйте новый каталог и старый, чтобы новая версия «go live». Это также сжимает окно состояния гонки: теперь есть только один короткий момент (междуопераций), когда есть нет версии, вместо немного более длинного окна (во время checkout), когда есть сочетание старых и новых версий.

Примечание: Сценарий вы показываете будет идти наперекосяк, если есть тег с именем master или develop в качестве эталонных имен для этих двух является refs/tags/master и refs/tags/develop соответственно. Я рекомендовал бы исправить эту проблему (если вы заботитесь :-)) через функцию оболочки и case заявления, чтобы сократить процесс икрометания в не-разворачивать случаи, например .:

die() { 
    echo "[email protected]" >&2 
    exit 1 
} 

# deploy (to given path, $1) the version named by $2 
# if the target is /some/path/there we use a temp version 
# named /some/path/tmp.<pid> to hold the new one until we 
# can swap it out, and $1.old.<pid> while we remove the old. 
deploy() { 
    local path=$1 branch=$2 
    local tmpdir=${path%/*}/tmp.$$  # tune this as needed 

    echo "deploying $branch to $path via $tmpdir..." 
    trap "rm -rf $tmpdir" 0 1 2 3 15 
    mkdir $tmpdir || die "can't create work dir $tempdir" 
    git --work-tree=$tmpdir/ checkout -f $branch 
    mv $path $path.old.$$ || 
     die "unable to move live version out of the way" 
    mv $tmpdir $path || 
     die "unable to set new version live" 
    trap - 0 1 2 3 15 
    echo "done, cleaning up old version" 
    rm -rf $path.old.$$ 
} 

while read oldrev newrev ref; do 
    case $ref in 
    refs/heads/master) deploy /path/to/my/project/live master;; 
    refs/heads/develop) deploy /path/to/my/project/dev develop;; 
    esac 
done 

(примечание: полностью непроверенное).

+0

будет работать дерево-дерево, как и ожидалось, если репозиторий является открытым хранилищем? – Shunya

+0

Да, или, по крайней мере, он определенно работает с переменной env, он также должен работать с параметром командной строки. – torek

+0

У меня есть ошибка: remote: mv: невозможно переместить '/ path/to/my/project/dev /' в его подкаталог, '/path/to/my/project/dev/.old.847' и удаленный : не удается переместить живую версию в сторону – Norbert

2

Я столкнулся с той же проблемой. Изучал rsync, чтобы скопировать файлы папок tmp в живую папку, но потом я понял, почему не просто использовать git glean на рабочем дереве.

Я не уверен, было ли это плохо, но он должен удалить только ненужные файлы из папки и использовать ваши настройки .gitignore, чтобы не удалять файлы, не входящие в ваше репо.

Кажется, что я хочу, чтобы очистить оставшиеся файлы, которые не были удалены нажатием.

#!/bin/sh 
while read oldrev newrev refname 
do 
    branch=$(git rev-parse --symbolic --abbrev-ref $refname) 
    if [ "master" == "$branch" ]; then 
     GIT_WORK_TREE=/home/store/public_html git checkout -f master 
     GIT_WORK_TREE=/home/store/public_html git clean -fd 
    fi 
    if [ "test" == "$branch" ]; then 
     GIT_WORK_TREE=/home/store/test_html git checkout -f test 
     GIT_WORK_TREE=/home/store/test_html git clean -fd 
    fi 
    if [ "dev" == "$branch" ]; then 
     GIT_WORK_TREE=/home/store/dev_html git checkout -f dev 
     GIT_WORK_TREE=/home/store/dev_html git clean -fd 
    fi 
done 
Смежные вопросы