git checkout -f приводит к измененным, неустановленным файлам

Для моего сайта у меня есть пустой репозиторий (куда я нажимаю) и клон с рабочим каталогом, который служит корнем документа.

В голом хранилище я настроил post-receive зацепите автообновление сайта:

#!/bin/sh
WEB_DIR=/var/www/www.mysite.com

# remove any untracked files and directories
git --work-tree=${WEB_DIR} clean -fd

# force checkout of the latest deploy
git --work-tree=${WEB_DIR} checkout --force

К сожалению, после перехода к "пустому" хранилищу изменения действительно обнаруживаются в корне документа, но все же они отображаются как неустановленные изменения. Затем я должен очистить все, делая git checkout -- <files> с последующим git pull,

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

Я читал, что лучше использовать checkout в сообщении post, чем pull в разных местах, поэтому я не знаю, будет ли это хорошим изменением...

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

1 ответ

Решение

Это сбивает с толку

Итак, сейчас у вас есть (например):

/repos
    /mysite
        /.git 
            ...
/var
    /www
        /www.mysite.com
            /.git
                ...
            index.htm
            ...

Ничего странного там нет. Однако используемый хук не соответствует друг другу, из-за чего репозиторий git рабочей копии не синхронизируется с извлеченными файлами:

/repos
    /mysite
        /.git <- This git dir
            ...
/var
    /www
        /www.mysite.com <- This working copy
            index.htm
            ...

Каталог git для рабочей копии игнорируется. Это делает вещи довольно запутанными - файлы рабочей копии извлекаются, чтобы соответствовать состоянию пустого хранилища, игнорируя любую информацию о git рабочей копии.

Упрости

Вместо этого сделайте что-то вроде следующего:

#!/bin/sh
# see http://serverfault.com/q/107608/108287
# for why you can't just run git pull with no arguments

WEB_DIR=/var/www/www.mysite.com

cd $WEB_DIR

# Remove the comments after verifying that it works to reduce noise
git --git-dir $WEB_DIR/.git fetch # > /dev/null
git --git-dir $WEB_DIR/.git checkout --force # > /dev/null
git --git-dir $WEB_DIR/.git clean -fd # > /dev/null

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

Другие вопросы по тегам