Git Автоматически отправляет файлы в Dev и Production из центрального репозитория в зависимости от того, какая ветка отправлена - PullRequest
2 голосов
/ 22 апреля 2011

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

В моей сети три сервера: один для разработки (dev.example.com), одиндля производства (www.example.com), и другой, который играет центральную роль между ними (central.example.com).

Я хочу создать основной (возможно пустой) Git-репозиторий на Central, который яМожно нажать на с моей локальной машины (которая отделена от трех основных серверов, но в одной сети).В идеале это репо должно иметь две ветви: master и Development.Моя локальная машина будет иметь дело только с этим репо в Central.

Когда я отправляю в ветку dev в Central, Central должен затем передать эти изменения на сервер DEV.Аналогичным образом, изменения в основной ветке должны быть перенесены в WWW.Я думаю, что использование зацепки / обновления было бы лучшим способом для достижения этой цели.

Вот грубая диаграмма:

 Local
   |
 Central
  /   \
DEV   WWW

Может ли кто-нибудь любезно указать мне правильное направление?Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011

Вы должны использовать post-update или post-receive крючок; это те, которые запускаются после завершения загрузки в репозиторий. Единственная разница между ними заключается в том, как они получают аргументы.

Чем бы я предложил использовать ssh-триггер для производственного / промежуточного сервера, чтобы запустить оттуда пулл, потому что:

  • Вам все равно нужно запустить какой-то код, потому что push in git не поддерживает проверку выдвинутой версии на удаленном конце. Так что тебе понадобится еще один крючок.
  • Выполнение push там означает разрешение на push-доступ, а это означает еще одну вещь для обеспечения безопасности. С другой стороны, триггер ssh будет иметь жестко закодированную ветвь для извлечения, поэтому никто не сможет причинить ему вред, если только центральный репозиторий также не будет скомпрометирован и, что еще более важно, даже если это так, потенциальный вред ограничен только тем, чтобы обмануть его, чтобы вытащить плохую версию. , но данные не могут быть удалены и доступ к остальной части компьютера невозможен.

Триггер ssh - это сценарий, связанный с конкретным открытым ключом в ssh (префикс открытого ключа в .ssh/authorized_keys с command= триггер ). Когда вы входите в систему с помощью ssh, используя этот ключ, ssh игнорирует команду, предоставленную клиентом, и запускает триггер. Это ограничивает возможный ущерб, когда кто-то крадет ключ, потому что триггер может использовать свою собственную логику, чтобы знать, что делать, и не принимать какой-либо ввод от клиента.

В качестве альтернативы вы можете просто нажать и установить соответствующий крючок для проверки. См этот вопрос .

2 голосов
/ 22 апреля 2011

Вы можете установить хуки в Git, чтобы легко получить то, что вы хотите здесь.Используйте хук пост-получения, который получает от stdin следующее:

<oldrev> <newrev> <refname>

Пример:

aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master

Использование refname вы можете видеть в своем скрипте, в какую ветвь выдвигается ветка и вызывать push в соответствующий репозиторий - www или dev.

Или вы можете использовать post-update ловушку, которая получает only refname, а также аргумент , чтобы сделать то же самое.

Ради полноты крюк должен быть размещен в крюках центрального репо.

...