Использование 'git pull' vs 'git checkout -f' для развертывания сайта

Я нашел два общих подхода к автоматическому развертыванию обновлений веб-сайта с помощью открытого удаленного репо.

Первый требует, чтобы репо было клонировано в корень документа веб-сервера, а в крюке после обновления используется git pull.

cd /srv/www/siteA/ || exit
unset GIT_DIR
git pull hub master

Второй подход добавляет "отдельное дерево обработки" в голый репозиторий. Крюк post-receive использует git checkout -f для репликации хранилища HEAD в рабочий каталог, который является корнем документа webservers, т. Е.

GIT_WORK_TREE=/srv/www/siteA/ git checkout -f

Первый подход имеет то преимущество, что изменения, внесенные в рабочий каталог веб-сайтов, могут быть зафиксированы и возвращены к общему репо (однако файлы не должны обновляться на реальном сервере). Второй подход имеет то преимущество, что каталог git не находится внутри корня документа, но это легко решить с помощью htaccess.

Является ли один метод объективно лучше другого с точки зрения лучшей практики? Какие еще преимущества и недостатки мне не хватает?

Ответ 1

В период управления выпуском (здесь развертывание) лучше всего иметь целевую среду, которая не зависит от механизма выпуска.
Другими словами, второе решение (checkout -f) изменит структуру обычного веб-каталога без каких-либо других подкаталогов, которые не должны быть частью его (например, папки .git).
Я использую его, например, в " использовании git для развертывания моего приложения node.js на моем производственном сервере ".

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