Контекст Предположим, мы поддерживаем небольшой веб-проект. У нас есть песочница для разработки с git, отладчиками и другими полезными вещами.
Сайт уже запущен и код скопирован из песочницы на удаленный сервер.
Код необходимо иногда (а возможно, и часто) обновлять и модифицировать.
Естественно тестировать любые изменения в песочнице.
И тут возникает вопрос: как максимально просто и удобно обновить код на сервере? Первое решение, которое приходит на ум, — это простая команда git push : пишем в удалённый репозиторий и получаем обновлённую версию кода на сервере.
Но это не так просто.
В порыве энтузиазма настраиваем репозиторий на сервере и тщательно прячем папку .
git с веб-сервера.
Однако не все так просто: после первого изменения в песочнице заветный мастер сервера git push вернет нам что-то вроде:
Общий смысл этого сообщения таков: «невозможно выполнить push в текущую ветку не голого репозитория, так как рабочее дерево не будет соответствовать состоянию ветки».remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: error: is denied, because it will make the index and work tree inconsistent remote: error: with what you pushed, and will require 'git reset --hard' to match remote: error: the work tree to HEAD. remote: error: remote: error: You can set 'receive.denyCurrentBranch' configuration variable to remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into remote: error: its current branch; however, this is not recommended unless you remote: error: arranged to update its work tree to match what you pushed in some remote: error: other way. remote: error: remote: error: To squelch this message and still keep the default behaviour, set remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
Стоит отметить, что для голые репозитории такой ошибки не будет. Но этот тип репозитория совершенно не подходит для наших целей.
Кроме того, не будет ошибок, если мы отправим запрос в ветку, отличную от текущей.
Результат этой операции еще дальше от того, что нам нужно.
Концепция
Для решения возникшей проблемы воспользуемся возможностью git реагировать на манипуляции, производимые над репозиторием, с помощью хуков (триггеров).Сначала войдите на сервер и создайте производственную ветку.
git checkout -b production
Редактирование файла .
git/hooks/post-receive .
Содержание должно быть таким: #!/bin/sh
cd .
env -i git merge --ff-only master
Эта настройка позволяет вам покинуть удаленный репозиторий с текущей производственной веткой.
И каждое нажатие в этот репозиторий будет вызывать слияние основной ветки с рабочей, что фактически обновит файлы в рабочем каталоге.
Не забудьте установить разрешение на запуск скрипта: chmod +x .
git/hooks/post-receive
Радуемся и возвращаемся в песочницу.
Теперь вы можете обновить свое производство с помощью простой команды мастер сервера git push .
Приятные дополнения
До конца файла .git/hooks/post-receive В любой скрипт можно добавить вызов, выполнение которого необходимо для полного развертывания кода.
Например, очистка кэша, сборка файлов локали, обновление базы и т.д.
источники вдохновения
- Совет по Git: автоматическое обновление рабочего дерева через перехватчик после получения
- как исправить такой не голый пуш?
-
Кэмпбелл, Уильям Уоллес
19 Oct, 24 -
Прототип Дата-Центра На Метане
19 Oct, 24 -
До Gopro: Эволюция Экшн-Камер
19 Oct, 24 -
Подкаст Unclesosky - Эпизод №19
19 Oct, 24 -
«Бегун» Открыл Контекстное Кафе
19 Oct, 24