Как сделать файлы обновления «git push» на вашем веб-хосте?

13

У меня есть несколько сайтов, которые все размещены на одном веб-хостинге под общим хостингом. Мой веб-хостинг поддерживает Git, и у меня есть SSH-доступ к нему, а также у меня есть настройка Git на моем ноутбуке.

Я хочу сделать так, чтобы при выполнении «git push origin master» он автоматически обновлял файлы на моем веб-сервере, а также сохранял резервную копию файлов предыдущего коммита, чтобы я мог легко откатиться, если захочу. Это возможно?

Райан
источник
Любопытно, кто ваш хостинг-провайдер?
пользователь
И зачем вам нужна «резервная копия файлов предыдущего коммита»? Вы можете просто нажать предыдущий коммит, если вы хотите откатиться назад (при условии, что вы всегда знаете, что вы нажали в последний раз - но вы все равно должны это знать).
Слеск

Ответы:

12

Это обобщено из Использование Git для управления веб-сайтом

Ключом к процессу является ловушка на стороне сервера «post-receive» (подробнее о перехватах git на странице « Настройка Git - Git Hooks» и справочной странице githooks ). Эта ловушка запускается после того, как сервер получил все данные.

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

#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f

Поместите это в hooks/каталог как post-receiveи исполняемый файл. Конечно, путь меняется на то, где у вас есть файлы вашего веб-сервера (использование GIT_WORK_TREEустанавливает переменную окружения, так что вам не нужно манипулировать точечными файлами и настройками git на сервере).

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


источник
Следует отметить, что это означает, что вы используете git в качестве инструмента развертывания, для которого он на самом деле не предназначен. Это может работать, но есть множество ограничений (необходимо загружать весь репозиторий, нет способа вызывать скрипты или управлять разрешениями на файлы, нет способа распаковывать вещи ...). Вероятно, лучше использовать правильный инструмент развертывания.
Слеск
@sleske Вы можете сделать все это в post-receiveхуке, который на самом деле является просто сценарием, куда вы можете вставить все, что захотите.
Марио
@Mario: Да, вы можете - это означает, что вы эффективно внедряете свое собственное решение для развертывания в качестве ловушки после получения. Использование существующего решения по-прежнему имеет свои преимущества, но иногда лучше всего
справиться самому
Вы даже можете оформить извлечение в промежуточную папку и иметь ссылки из веб-папки на промежуточную папку, чтобы избежать наличия файлов .git в вашей веб-папке.
согнуло
0

Самый простой способ обновить рабочее дерево репозитория, к которому вы обращаетесь, - это настроить git config receive.denyCurrentBranch updateInstead на стороне получателя. Смотрите https://git-scm.com/docs/git-config/#git-config-receivedenyCurrentBranch

Ответ Райана с перехватами после фиксации лучше в том, что он позволяет проверить в другом месте (вы, вероятно, не хотите иметь .git в своей веб-папке). Но на этом уровне было бы неплохо использовать какой-либо существующий инструмент развертывания, как сказал sleske в комментариях.

Echsecutor
источник