2010-02-22 8 views
11

Mi situación:Git: ¿hay una manera más rápida de fusionar de una rama a varias sucursales que hacer cada una de ellas en serie?

poco me he unido en el lado frontal de un proyecto ya establecido que consiste en un número creciente de casos de una aplicación de carriles, cada uno de ellos, que se diferencian en algunos aspectos (vistas, estilo , configuraciones, etc.) pero todos comparten la mayoría de su código de back-end.

Nuestra Git repo tiene una serie de ramas es como la siguiente:

master 
apple 
banana 
cherry 
... 
strawberry 
tangerine 
... 

Donde cada rama de la fruta es derivado posee el código de producción para una instancia de producción.

(Maestro no se utiliza para un despliegue en vivo, pero contiene todo el código compartido y es lo que nos gustaría clonar a partir de la creación de una nueva instancia.)

Mi problema:

Trabajo específico para una sola instancia es bastante simple, teniendo lugar en esa rama (o una rama de desarrollo), etc. etc ...

Sin embargo, si necesito hacer un cambio que afectará a todos los sitios en el clúster Lo hago en este momento en una rama de desarrollo y lo fusiono en maestro, y luego (lo que me fastidia) tiene que hacerlo manualmente. y revisa cada rama de producción a la vez y fusiona el maestro en ella.

Incluso mi humilde código mono cerebro puede ver que esto no se escala bien.

Por el momento tenemos algo así como 8 ramas de producción, así que no es tan malo, pero el plan es para el crecimiento y para cuando llegue a 20 (y mucho más 50+) va a ser un dolor serio. También va a ser mi dolor personal, ya que soy el que probablemente lidiará con él día a día.

Por lo tanto, mis preguntas reales serían:

  • ¿Hay algo en la funcionalidad del núcleo git que me falta que me permita fusionar con elegancia de maestro en n otras ramas de una sola vez? (Improbable, creo, pero vale la pena preguntar, de todos modos)
  • Alternativamente, ¿podría haber una manera de hacer esto con astutos scripts de shell? (de lo cual podría agregar, sé muy poco, y entiendo aún menos)

Si este último puede ayudarme alguien a comenzar/apuntarme en la dirección correcta?

Muchas gracias de antemano por su tiempo y ayuda.

Respuesta

8

Antes de responder a esto, quiero dejar muy claro que esta es solo una buena idea en casos como este donde las ramas en las que se funden son ramas de producción, no ramas de desarrollo. Si ha encontrado esta publicación buscando una forma de fusionar ramas de integración (maestra) en todas las ramas de su tema (desarrollo), la respuesta es que casi con certeza no debería (see here).

Bien, y la verdadera respuesta. No hay una forma incorporada, porque (asumiendo que no es un avance rápido) realmente tienes que tener los archivos revisados ​​para que git haga su magia de fusión.Afortunadamente, en realidad no está haciendo mucho (git checkout && git merge) por lo que no es problema escribir un script. Usted podría complicar esto con un archivo de configuración, o incluso añadir algunas cosas a medida para .git/config (por ejemplo git config branch.<branchname>.productionbranch true, y luego utilizar los comandos git para comprobar que se ramifica tiene ese conjunto de bandera), pero la forma más sencilla sería algo como esto:

#!/bin/bash 

production_branches=(branch1 branch2 branch3) 

for branch in ${production_branches[@]}; do 
    if ! (git checkout $branch && git merge master); then 
     exit 
     # Exit on the first error 
     # If you want to just plow ahead, do something like this: 
     # git reset --hard  # make sure there aren't merge conflicts in the tree 
     # failed_merges="$failed_merges $branch" # remember for later 
    fi 
done 

# if you plowed ahead above, print the branches which failed to checkout+merge 
# if [ -n "$failed_merges" ]; then 
#  echo "Failed merges: $failed_merges" 
# fi 

Como siempre, hay muchas mejoras que puede hacer. Por ejemplo, puede usar algunos comandos de git para verificar si el maestro ya se ha fusionado en una rama determinada, y evitar echarle un vistazo. Si avanza en las fusiones fallidas pasadas, puede hacer el pago y fusionarse por separado en caso de que el proceso de pago haya fallado (lo que podría implicar un árbol de trabajo sucio, lo que significa que todos fallarán). ¡Espero que esto sea suficiente para que comiences!

+0

Hola Jefromi, gracias por la respuesta muy clara y útil. Es hora de ensuciarme las manos. Creo que ... –

+0

+1 para ese gran artículo al que te has vinculado. –

Cuestiones relacionadas