Un modelo de bifurcación de git decente para productos que deben acompañar la versión de otro producto de terceros (y las ventajas y desventajas de una propuesta)

13

Nota: Mi pregunta está enfocada en mi problema específico (que involucra a Liferay) pero espero que pueda ser útil para cualquier persona que necesite mantener varias versiones de un mismo proyecto en git.

Trabajo en una empresa que escribe muchos complementos para Liferay Portal . Estos complementos (portlets, temas, etc.) suelen ser reutilizables y, por supuesto, deben actualizarse para las nuevas versiones del portal.

Sin embargo, es habitual tener que migrar, digamos, un portlet a una nueva versión de Liferay y para mantener su versión anterior. Además, con frecuencia tenemos que crear personalizaciones muy específicas para algunos clientes, lo que no tiene sentido agregarse a la "versión principal".

Estos requisitos complican nuestro trabajo pero, afortunadamente, podemos asumir algunas simplificaciones. Por ejemplo, los complementos se actualizan con frecuencia por un solo programador a la vez. Es muy raro que se agreguen dos o más funciones a un complemento al mismo tiempo.

Ahora, estamos migrando a Gitorious . Estamos tratando de concebir un modelo de bifurcación para tal escenario.

Mi modelo

Lo que propuse fue:

  1. Cada complemento tendría su propio repositorio en Gitorious dentro de un proyecto. Por ejemplo, un portlet para mostrar gatitos tendría un repositorio kittens-portlet dentro del proyecto liferay-portlets .
  2. Al crear un nuevo complemento, créelo en una rama nombrada de acuerdo con la versión de Liferay (por ejemplo, lf5.2 ).
  3. Cada vez que se realiza una actualización en el complemento, la actualización se aprueba y se implementa en producción, etiquete el complemento con una versión (por ejemplo, lf5.2v1 , lf5.2v2 etc.) *
  4. Cada vez que se debe portar un complemento a una nueva versión de Liferay, ramificamos la versión más reciente (creando, por ejemplo, la rama lf6.0 ).
  5. Una vez en producción, el jefe de la nueva sucursal recibirá una etiqueta como lf6.0v1 .
  6. Cada vez que tenemos que personalizar un complemento de una manera específica del cliente, creamos una rama con el nombre del cliente (por ejemplo, crearíamos una rama lf5.2clientcorp para nuestro cliente "ClientCorp Inc.")

Este es un modelo inusual: no tendría master y muchas ramas que no se fusionan. Así es como supongo un repositorio con dicho modelo se vería así:

Unamigoencontróestesistemabastantecomplejoypropensoaerrores.Sugirióelexcelenteypopular modelo de Vincent Driessen , que aún me resulta más difícil de manejar y disciplinar. -demander Es genial (y probado) por supuesto, pero parece demasiado complejo para nuestra situación.

El modelo de mi amigo

Luego sugirió otro modelo: tendríamos un repositorio para cada complemento en una versión de Liferay (así que comenzaríamos a crear un kittens-lf5.2-portlet y luego un kittens-lf6.0-portlet ), cada uno con una rama master y un develop rama. El master estaría siempre listo para la implementación. (O podría ser al revés, master y stable , como sugiere Steve Losh ).

Esto es muy simple, pero no me gustó este sistema:

  1. podría resultar en una gran cantidad de repositorios en un proyecto, haciendo que Gitorious sea difícil de navegar.
  2. El nombre del directorio del proyecto es relevante. Si alguien clona el repositorio en un directorio kittens-lf6.0-portlet y genera el WAR con ant (como es habitual), el nombre de WAR también será kittens-lf6.0-portlet . Las versiones anteriores de este portlet (llamadas kittens-portlet por ejemplo) se considerarían como portlets diferentes (y probablemente faltan) en un portal actualizado. Un poco de cuidado puede evitarlo, pero preferiría evitarlo.
  3. Las diferentes versiones del mismo complemento se mantendrían separadas. Rompo mi corazón :(
  4. kittens-lf6.0-portlet es un nombre feo para un repositorio, creo.

Sospecho que los dos últimos puntos, que son los dos más subjetivos también, son la razón principal de mi falta de voluntad. No obstante, las cuatro objeciones se mantienen.

OTOH, mi propia propuesta me parece extraña y me pregunto si hay errores ocultos en ella. OT3rdH git es tan poderoso y flexible que creo que no debería avergonzarme al explorar sus posibilidades.

Entonces, pregunto:

  1. ¿Cuál sería el mejor modelo? ¿Mi propuesta? ¿El modelo de mi amiga? ¿El tradicional sistema de Vincent Driessen?
  2. ¿Qué otro modelo de ramificación sugeriría?
  3. Si crees que mi modelo es malo, ¿por qué crees? Me encantaría saber cuáles son los inconvenientes y los puntos ciegos.

* En realidad, preferiría etiquetar la confirmación con una versión como v1 pero aparentemente una etiqueta en git no tiene un alcance en la rama, es decir, no podría tener una etiqueta de 1 v1 en lf5.2 y otro en lf6.0 , así que tengo que nombrar la rama. ¿Es correcto por cierto?

    
pregunta brandizzi 03.02.2012 - 23:46

2 respuestas

2

Si leo esto correctamente, las sucursales son básicamente una desviación de una sola vez de su línea principal de desarrollo, nunca se pretende fusionarlas de nuevo con la línea principal y los avances en la línea principal nunca se aplican a estas ramas. La única desviación sería que las correcciones de errores apropiadas para la versión en la que se basó la rama se deben aplicar a la rama.

La respuesta ahora gira en torno a su flujo de trabajo diario, el número de desarrolladores que trabajan en una rama o el número de cambios son pistas falsas. Considero que su necesidad principal es querer saber qué ramas obtienen una actualización de corrección de errores de un cambio de sucursal principal y para esto creo que el repositorio combinado con sucursales será más eficiente ya que todo está en un solo lugar. Si nunca hubiera necesidad de realizar una polinización cruzada, los depósitos por separado lo impondrían, pero ese escenario no coincide con la realidad de su proyecto como yo lo entiendo.

El modelo Driessen funcionaría bien si su proyecto necesitara fusionar las ramas nuevamente en la línea principal de desarrollo, pero no necesita eso. Aun así, creo que hay mérito en mantener un concepto de Desarrollo Inicial y StableRelease si estás trabajando en un producto que está activo.

Entonces, para resumir, creo que su proyecto funcionaría bien con su modelo de bifurcación más una pizca de Driessen para su línea principal. Su experiencia puede ser diferente; Siempre he trabajado con una rama de "publicación pendiente" que se convierte en una rama "en vivo" y en una "próxima versión" separada que requiere polinización cruzada de correcciones y cambios en varios puntos para que mi percepción pueda estar sesgada.

    
respondido por el Patrick Hughes 07.02.2012 - 01:11
3

Lo que me sorprende es el hecho de que cada portlet tiene su propio repositorio (pero es posible que su historia no esté completa). Personalmente crearía un repositorio por proyecto. Los proyectos a menudo tienen múltiples portlets y todos se crean en la misma ejecución contra la misma versión de Liferay. Cada proyecto puede ser un duplicado de un proyecto existente que se compile con una versión diferente de Liferay, pero solo dividiría un producto si las diferencias son demasiado grandes. Si una construcción funciona contra Liferay 5.1 y 5.2, no dividiría el proyecto. Usaría scripting o Maven (o ambos) para que todo funcione. Usaría un Wiki (o Trello) para la gestión de cada producto y con qué versión de Liferay se puede compilar.

Por cierto: soy programador de Java, especialista de Maven, especialista en compilación y tengo experiencia con Liferay y otros servidores de portal (IBM WebSphere y Glassfish).

Pero esto es solo mi € 0.02.

    
respondido por el Ivo Limmen 08.02.2012 - 07:20

Lea otras preguntas en las etiquetas