Вот решение, которое я достиг, чтобы удовлетворить потребности в переводе моей работы по разработке в «производство» (живой веб-сайт), а также в актуальном состоянии моего локального хранилища с изменениями, происходящими на живом веб-сайте ...
Чтобы обновить сайт, нужно просто перенести мою локальную ветку разработки в репозиторий сайта ...
git push origin dev
... и затем объедините изменения в живое дерево веб-сайта. Мне нужно SSH войти на сервер веб-сайта и выполнить следующую команду в папке веб-сайта:
git merge dev
Это перенесет внесенные изменения в ветке "dev" в ветку "master" (которая является текущей веткой сайта).
* УЛУЧШЕНИЕ ПРОЦЕССА ОБНОВЛЕНИЯ *
Для автоматического запуска слияния без необходимости входа в систему и запуска команды слияния из командной строки сервера я добавил хук post-receive в репозиторий живого веб-сайта. Сначала я создал файл ловушек, сделал его исполняемым, а затем отредактировал файл:
touch /path/to/website/.git/hooks/post-receive
chmod a+x /path/to/website/.git/hooks/post-receive
pico /path/to/website/.git/hooks/post-receive
Содержимое моего файла ловушек после получения:
#!/bin/sh
unset GIT_DIR
cd /path/to/website
echo "Merging dev changes to master branch."
git merge --ff-only dev
exit 0
Обратите внимание на параметр - ff-only , добавленный в команду объединения. Почему это там? Это происходит потому, что, будучи автоматизированным процессом, я не хочу, чтобы конфликты слияния сохранялись в файлах моего живого сайта. Поэтому, используя эту опцию, я заставляю объединение происходить только при наличии чистого контекста перемотки вперед. Если это чистое слияние не может произойти, я могу войти на сервер и вручную разрешить проблему или решить проблему, используя другой подход.
* ПРЕДОТВРАЩЕНИЕ КОНФЛИКТОВ И СИНХРОНИЗАЦИИ *
Во избежание конфликтов слияния на сервере, т. Е. Для обеспечения успешного слияния с ускоренной пересылкой, рекомендуется обновить локальное репо последними изменениями из удаленного репо. Другими словами: обновите локальную ветку разработки последними изменениями на веб-сайте (удаленная главная ветка), прежде чем отправлять наши изменения. Это можно сделать так:
git pull origin master
Еще лучше: давайте сначала обновим локальную ветку master, а затем объединяем ее с локальной веткой разработки (звучит как rebase):
git stash save
git checkout master
git pull origin master
git checkout dev
git stash pop
git merge master
Таким образом, наша локальная главная ветвь синхронизируется с удаленной живой ветвью главного веб-сайта, и объединение выполняется на 100% локально.
* НАЗАД К ПРОСТОТЕ *
Я создал псевдоним для облегчения вещей:
git config alias.deploy '!git stash save && git checkout master && git pull origin master && git checkout dev && git stash pop ; git merge master && git push origin dev'
Теперь я могу выполнить обновление сайта в реальном времени, используя псевдоним "deploy", например:
git deploy
Это будет:
- Переключиться на локальную главную ветку
- Обновление локальной ветки master с последними внесенными изменениями веб-сайта (синхронизация)
- Переключиться обратно на ветку dev
- Объединить изменения с локальной веткой разработчика (разрешение конфликтов здесь при необходимости)
- Нажмите локальную ветку dev на удаленной ветке dev сайта
- Если на сервере правильно настроен хук после получения, он автоматически перемотает репо на веб-сайт, поэтому изменения в dev будут опубликованы для производства!
У меня работает эта настройка, и она удовлетворяет мои текущие потребности, которые просты.