2012-06-01 8 views
7

Ho diversi siti che utilizzano Drupal, ho diversi server, dal vivo, dev1, DEV2 ...Mantenere specchi Git in sincronia in ogni momento

di Drupal base di codice pronti contro termine è grande (112MB), quindi sono entusiasta per sfruttare al meglio le capacità di hard-linking di git in modo che ogni volta che aggiungo un sito non si stia duplicando.

Così su, ad esempio, sul server live ho un repository master completo, e tutti i miei siti sono cloni di questo, ognuno con un ramo diverso. Questo è ottimo su un server, i collegamenti rigidi sono usati, è veloce ed efficiente.

Ma sui miei server di sviluppo, tipicamente clonano tutti dal repository principale nudo, il che significa che due siti sulla stessa macchina non possono utilizzare collegamenti fisici per risparmiare spazio.

Quello che mi piacerebbe fare è impostare uno specchio del repository nudo su ciascuno dei miei server di sviluppo e quindi clonarlo.

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 

Tutto bene finora. Ma voglio che gli specchi rimangano sincronizzati in ogni momento. Quindi ho usato post-receive hook sul mirror di dev1 per fare git push --mirror origin. Ora se site1 su dev1 invia commit, vengono premuti magicamente sul master-bare-repo.

Ma cosa succede se faccio un cambiamento sul server vivo, e spinta che? Non riesco a impostare un hook post-receive per spingere all'altro perché questo presumibilmente attiverebbe gli loro amipost-receive che finirebbero in ricorsione?

C'è qualche modo intelligente intorno a questo?

+1

Un processo in background che tenta periodicamente di eseguire il push e passare al server live (anziché post-ricezione)? Inoltre, provalo, ma non credo ti resteresti bloccato in un loop con il tuo metodo, perché la seconda volta che provi a spingere l'altro server non ricevi nulla poiché non c'è nulla da spingere. – Shahbaz

risposta

4

Prima di tutto, non finirà in una ricorsione, dal momento che il post-ricezione gancio non viene eseguita quando "Tutto è aggiornato" (come indicato nel this other question), che sarà il risultato del spinge dai mirror al server live.

D'altra parte, non è tutto un progetto scalabile (ogni volta che si aggiunge un nuovo mirror, è necessario modificare il hook del server live per aggiungere un sito da spingere). Probabilmente troverai più elegante usare una strategia di sincronizzazione "pigra" nei tuoi mirror: quando ricevono una spinta, non li spingono semplicemente verso il master, ma prima li recuperano/tirano dal master. In questo modo non è necessario impostare un hook nel master e la strategia di sincronizzazione sarà completamente gestita dai mirror. Il rovescio della medaglia di questa strategia è che si potrebbe eventualmente voler apportare una modifica al server live che si vuole propagare ai mirror prima che questi debbano spingere qualsiasi modifica. Quindi devi valutare se le modifiche ai tuoi master saranno così importanti da compensare il trade-off in termini di scalabilità. Naturalmente, una patch per rendere questo "scalabile" anche "sincronizzabile" è usando un cron job esterno per controllare periodicamente le modifiche nel master, come suggerito nei commenti.

+0

Sembra che funzionerà! Grazie. Farò un tentativo e spunta la risposta una volta testato. – artfulrobot