2010-07-21 12 views

Respuesta

19

En el servidor central se crea un gancho changegroup.

Así que su servidor central tendría la siguiente hgrc:

[paths] 
server2=http://server2 
server3=http://server3 
[hooks] 
changegroup.server2 = hg push -f server2 
changegroup.server3 = hg push -f server3 

Es posible tener varios ganchos para el mismo evento, por lo que no debería ser un problema.
La ventaja del gancho changegroup sobre el gancho del conjunto de cambios es que se ejecuta con mucha menos frecuencia.

+2

Esta es la mejor solución, ya que solo se activará si la inserción en el servidor 1 tuvo éxito. Probablemente necesites 'push -f' en esas líneas de gancho de grupo de cambio si estás trabajando con historias de branchy. –

+1

Agregado -f opción –

+0

El código necesita edición para que funcione. Mercurial le permite [realizar múltiples acciones por evento] (http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html) ** agregando una extensión al final ** de un el nombre del gancho. Extiende el nombre de un gancho al dar el nombre del gancho, seguido de un punto (el carácter "."), Seguido de un texto más de tu elección. Por ejemplo, Mercurial ejecutará commit.foo y commit.bar cuando ocurra el evento commit. –

1

En su archivo .hg/hgrc debe tener una directiva [paths], que contiene su ubicación predeterminada. ¿Qué pasa con la adición de algo como:

[paths] 
default = http://server1 
server2 = http://server2 

y luego hacer un:

hg push default 
hg push server2 
+2

sí, ese es el problema. Conozco esta solución, lo que quiero es un gancho o un gatillo que, al presionar con éxito al servidor 1, se inicie automáticamente el envío al servidor2. La solución anterior siempre tiene la posibilidad de olvidarse de presionar a un servidor. Por cierto, gracias por una respuesta rápida. – Akshay

+0

He enfrentado un problema de cadena de empuje automático. ¿Resuelve o no? –

0

supongo que uno de los servidores es un repositorio maestro, el resto son implementaciones. en tal situación, interactuaría solo con el maestro y dejaría las implementaciones hasta cron:

cat >$HOME/bin/dist <<'EOM' 
#!/bin/sh 
cd ${1:?} 
tip=$(hg tip --template '{node}') 
for r in $remotes; do 
    hg push -r $tip $r 
done 
EOM 

chmod +x $HOME/bin/dist 
(crontab -l; echo '*/5 * * * * $HOME/bin/dist /var/repos/master') | crontab - 
+0

huh .. ¿qué pasará si más de una confirmación ha sido presionada en menos de 5 minutos? :-). En este caso, es mejor configurar un gancho "changegroup". Además, cuando un conjunto de cambios está creando una rama, sería necesario presionar con la opción -f (fuerza). Mi consejo, si quieres usar cron en lugar de un gancho, sería configurarlo en las máquinas remotas que regularmente generarían cambios: de esta forma, puede haber más de un conjunto de cambios (por lo que incluso puedes extraer cada horas de ejemplo), y también pull no requiere la opción -f. Solo mi 0.02 €. Saludos, Christophe. La solución de –

+1

funciona bien. 'empujar' empuja 'punta' y todos sus antepasados, por lo que obtendrán todo. Sin embargo, hay un montón de código innecesario, puede usar el nombre 'consejo' en lugar de usar la plantilla para aprenderlo (-r toma nombres muy bien), y puede omitir el -r param todo junto y simplemente 'pulsar' predeterminado para propina. Es probable que desee push -f, ya que puede necesitar insertar nuevas ramas y nuevas cabeceras en algún momento y no desea que la secuencia de comandos falle. –

+0

@ ry4an: no puede usar el nombre 'tip', ya que podría apuntar a un conjunto de cambios diferente antes de que la secuencia de comandos llegue del servidor1 al servidor3.esa es precisamente la razón por la que no puedes dejar de lado el '-r': si quieres que todos los retrovisores tengan la misma sugerencia después de cada inserción, debes apegarte a la misma revisión para todo el script. el comentario '-f' es válido, sin embargo. –

Cuestiones relacionadas