2012-06-01 3 views
7

У меня есть несколько сайтов, которые используют Drupal, у меня есть несколько серверов, жить, dev1, DEV2 ...Ведение GIT зеркала в синхронизации во все времена

кодовая репо Drupal является большой (объем которой составляет 112), так что я увлечена чтобы максимально использовать возможности жесткой связи git, так что каждый раз, когда я добавляю сайт, это не дублирует это.

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

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

Что бы я хотел сделать, это настроить зеркало голого репо на каждом из моих серверов-разработчиков и затем клонировать от него.

dev1$ git clone --mirror live:master-bare-repo dev1-mirror-repo 
dev1$ git clone -b site1 dev1-mirror-repo site1 
dev1$ git clone -b site2 dev1-mirror-repo site2 

Все до сих пор. Но я хочу, чтобы зеркала постоянно синхронизировались. Поэтому я использовал post-receive hook на зеркале dev1, чтобы сделать git push --mirror origin. Теперь, если site1 на dev1 нажимает на коммит, они магически подталкиваются к master-bare-repo.

Но, что если я делаю изменения на живом сервере и нажмите что? Я не могу установить крючок post-receive, чтобы нажать на другой (-ы), потому что это предположительно вызовет ихpost-receive крючки, которые попадут в рекурсию?

Есть ли какой-нибудь умный способ обойти это?

+1

Может ли фоновый процесс периодически пытаться извлечь и нажать на работу в реальном времени (вместо post-receive)? Кроме того, попробуйте, но я не думаю, что вы застряли в цикле с вашим методом, потому что во второй раз, когда вы пытаетесь нажать другой сервер, ничего не получает, так как ничего не нажать. – Shahbaz

ответ

4

Прежде всего, вы не будете в конечном итоге в рекурсии, так как после приема крючок не выполняется, когда «Все до настоящего времени» (как указано в this other question), который будет результатом толкает с зеркал на живой сервер.

С другой стороны, это еще не все масштабируемые конструкции (каждый раз, когда вы добавляете новое зеркало, вам нужно будет сменить крюк вашего реального сервера, чтобы добавить сайт, который нужно нажать). Вероятнее всего, вы найдете более элегантным, чтобы использовать «ленивую» стратегию синхронизации в ваших зеркалах: когда они получают толчок, они не просто нажимают на мастера, но до этого они извлекают/тянут от мастера. Таким образом, вам не нужно настраивать крючок в главном, а стратегия синхронизации будет полностью управляться зеркалами. Недостатком этой стратегии является то, что в конечном итоге вы захотите внести изменения в живой сервер, который вы хотите распространить на зеркала, прежде чем им нужно будет внести какие-либо изменения. Поэтому вы должны задуматься о том, будут ли изменения в ваших мастерах настолько важны, чтобы компенсировать компромисс в масштабируемости. Конечно, патч, чтобы сделать этот «масштабируемый» дизайн также «синхронизированным», - это использование внешнего задания cron для периодической проверки изменений в master, как это предлагается в комментариях.

+0

Похоже, это сработает! Благодарю. Я отвечу и поставлю галочку после проверки. – artfulrobot