git multi master setup?
Мне было поручено настроить следующую настройку.
В настоящее время у нас есть внутреннее каноническое репо для проекта с открытым исходным кодом. У нас есть ловушка post-receive, которая отправляет любые обновления в удаленный репозиторий, доступные для общественности.
Джо Паблик может вытащить из публичного репо.
Никто не подталкивает к удаленному репо, кроме перехвата после получения
У нас довольно много пользователей, которые работают над кодом внутри, и я действительно не хочу связываться с рабочим процессом, который у них уже работает.
внутренние пользователи проверяют код из внутреннего канонического репо и фиксируют его.
внешние разработчики должны представить патчи, а затем внутренний пользователь зафиксирует их (после проверки).
На этом этапе мы хотим начать разрешать некоторым внешним разработчикам иметь доступ к репозиторию.
Это означает сделать канон удаленного репо.
Это также означает изменение рабочего процесса для пользователей. Если коллектив не может придумать что-то, чего мне не хватает в отношении мерзавца.
Быстрая диаграмма текущего рабочего процесса.
ВНУТРЕННИЙ ПОЛЬЗОВАТЕЛЬ.
клон из внутреннего репо. -> Обезьяна с кодом -> толчок к внутреннему репо -> хук пост-получения передан к удаленному репо.
ВНЕШНИЙ ПОЛЬЗОВАТЕЛЬ.
клон из внешнего репо. -> Обезьяна с кодом -> отправить патч через список рассылки -> Внутренний пользователь отправляет код во внутреннее репо -> Хук пост-получения переходит в удаленное репо.
НОВЫЙ РАБОЧИЙ ПОТОК ИДЕАЛЬНО!!
ВНУТРЕННИЙ ПОЛЬЗОВАТЕЛЬ.
клон из внутреннего репо. -> перед тем, как будет обеспечено клонирование, ловушка предварительного получения удостоверяется, что у нас есть обновленное зеркало с удаленного компьютера -> обезьяна с кодом -> передача во внутреннее репо -> ловушка предварительного получения проксирует фиксацию к удаленному репо и синхронизирует 2.
ВНЕШНИЙ ПОЛЬЗОВАТЕЛЬ.
клон из удаленного репо. -> Обезьяна с кодом -> подтолкнуть к удаленному репо.
Это похоже на установку с несколькими мастерами. Где вы можете отправить код в репо и получить код из любого репо.
Некоторые другие предостережения.
Внутренний репо может толкать и извлекать из удаленного репо. Удаленное репо не может достичь внутреннего репо.
Как вы думаете?
2 ответа
Это будет немного неприятно, и есть некоторые инструменты, разработанные для этого, но они работают, "блокируя" все репозитории, когда кто-нибудь вносит изменения в любой из них. В вашем случае, я думаю, есть более простой метод.
Все подталкивают к удаленному хранилищу, точка. Внутренние и внешние пользователи как.
Задание cron переносится из удаленного хранилища во внутреннее хранилище.
Предположим, удаленный репозиторий доступен по адресу ssh://remote/dir/proj.git
и внутренний репозиторий доступен по адресу ssh://internal/someplace/proj.git
, Добавить к каждому .gitconfig
:
[url "ssh://remote/dir/"]
pushInsteadOf = "ssh://internal/someplace/"
Это означает, что любой, кто клонирует внутренний репозиторий, все еще получает хорошую скорость извлечения с близлежащего сервера, но каждый подталкивает к одному и тому же удаленному репозиторию. однажды .gitconfig
настроен таким образом на всех рабочих станциях, вам нужно только clone
а также push
а также pull
- нет дополнительных флагов, нет необходимости настраивать вещи.
Обратите внимание, что единственным реальным преимуществом такой установки является дополнительная скорость, которую вы получаете при извлечении из внутреннего репозитория. Это наказание, так как гранулярность задания cron контролирует, как быстро внутренние пользователи могут получать изменения, но я действительно надеюсь, что у вас не будет кучки обезьян, набирающих текст в одной и той же ветке.
Примечание о крючках
В Git нет крючка, который срабатывает при получении хранилища. Если вы хотите делать такие вещи, когда вы тянете в ответ на git fetch
вы можете заменить git upload-pack
с помощью скрипта-обертки, который синхронизирует два хранилища перед вызовом реального git upload-pack
,
Я нахожусь в очень похожей ситуации - и мой запланированный подход состоит в том, чтобы попытаться настроить локальное репо для выполнения перехвата предварительного получения, который выполняет извлечение из удаленного узла (с автоматическим принятием локальных конфликтов слияния), и пост-получения крючок, который подталкивает к удаленному репо. Кроме того, я планирую настроить задачу cron, которая будет извлекать данные с удаленного на локальный каждые 5 минут или около того, а также автоматически принимать локальные слияния (поскольку я не могу нажать с удаленного -> локально)
Таким образом, удаленные пользователи выполняют push-pull своего репо, но локальное репо действует как "мастер", а локальные пользователи работают за локальным репо. Я полагаю, что существует много потенциальных проблем с автоматическим разрешением конфликтов. Поскольку наш CI настроен на сборку каждые 15 минут, когда есть фиксация, проблемы будут найдены достаточно быстро. Теперь, как все это подключить... Завтра начну...