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, так что все будет синхронизировано.