Следующее решение обновляет базу кода живого сервера с помощью кода из чистого репо на другом сервере.Это решение не использует scp и не копирует файлы для перезаписи на работающем сервере, потому что мы хотим избежать перезаписи всего каталога (с помощью git мы можем выбрать то, что хотим обновить).
Допущения :
- Вы отправляете свой код в пустой репозиторий на тестовом / промежуточном сервере (или это может быть только сервер для размещения вашего «централизованного» репо)
- ВыВы хотите обновить свой сервер в реальном времени с помощью кода в этом репо
- Ваш реальный сервер находится на другом сервере, чем ваш репо
На реальном сервере:
- Настройка не-пустого репозитория git, в котором размещаются живые файлы:
cd /var/www/www.yoursite.com && git init
- С этого живого сервера убедитесь, что у вас есть ssh-доступ к серверу, на котором вашпустой репозиторий, используя ssh-ключи (здесь не рассматриваются)
- Добавьте «централизованное» репо:
git remote add origin git@testserverip:/path/to/repo.git
- Теперь, каждый раз, когда вы хотите обновить базу кода живого сервера, выможно запустить
git fetch origin
, а затем git merge
Так как этоНа сервере вы обычно не хотите, чтобы конфликты слияний вызывали проблемы.Если вас не волнует потеря изменений на живом сервере (потому что вы, вероятно, никогда не измените ничего важного на живом сервере), вы можете использовать git merge -m 'Overwriting live server' -s recursive -X theirs origin/active-branch-on-live-server
Типичный сценарий - наличие других файлов (tempфайлы, измененные пользователем файлы и т. д.) на живом сервере, который вы не хотите перезаписывать).Убедитесь, что добавили все эти файлы / каталоги в ваш файл .gitignore и убедитесь, что они не добавлены git add.Таким образом, они не будут затронуты, когда код будет извлечен из вашего централизованного репо.
Если вы хотите, чтобы эта настройка была для меня более автоматической, создайте скрипт bash на работающем сервере:
git fetch origin
git merge -m 'Overwriting live server' -s recursive -X theirs origin/active-branch-on-live-server
Сделать этот скрипт как исполняемый скрипт bash (здесь не рассматривается).Теперь вы можете вызвать этот скрипт из ловушечного скрипта на «централизованном» сервере, чтобы живой сервер обновлялся каждый раз, когда вы нажимаете свой код.
В «централизованном» репо / тесте/ staging server:
(у вас уже должно быть настроено голое репо здесь, если вы его не создадите).
В вашем bare-repo.git / hooks / create / editфайл post-receive
, чтобы живой сервер запускал сценарий, созданный выше, когда код отправляется в пустое хранилище:
#!/bin/bash
while read oldrev newrev refname
do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
# Use this if-sentence to only update live server if branch is the wanted branch, e.g. master or stable
if [[ "stable" == "$branch" ]]; then
# Fetch this branch from live-server
ssh root@ip-to-live-server '/path/to/script-created-above'
fi
done
Убедитесь, что у пользователя git на сервере, на котором размещено ваше хранилище с открытым хранилищемдоступ к вашему живому серверу через ssh-ключи, так что ssh в приведенном выше сценарии работает.
Это схематический обзор.Подробности можно найти в других местах: