Diseñando una mejor estrategia de model de ramificación git

Breve descripción

Somos una compañía de productos y estamos brindando soluciones a más de 50 clientes, que están creciendo cada mes y tenemos un model de ramificación bastante simple que me gustaría actualizar si es posible.


El model

Estamos haciendo agilidad, por lo tanto, tenemos sprints y lanzamientos. Cada mes o dos estamos abriendo una nueva versión de la twig maestra que se estabilizará y luego se entregará a los clientes que estén interesados ​​en las características que contiene. Hasta aquí todo bien. Durante el desarrollo se crean nuevos clientes. Digamos que comenzamos a trabajar en un cliente A y decidimos que este cliente vaya con cierta versión, digamos release/1.0 por lo que hacemos el release/A_1.0 twig release/A_1.0 y comenzamos nuestro desarrollo allí, una vez que hayamos terminado, fusionamos release/A_1.0 -> release/1.0 e implementamos en producción desde la release/1.0 este cliente.

Antes de continuar explicando dónde está el problema, estableceré algunas reglas que guardamos:

  • Una vez que la twig de release está abierta, el master nunca se fusiona allí.
  • release/{client}_{version} twigs release/{client}_{version} se actualizan ocasionalmente con release/{version} branch (los numbers de versión deben coincidir).
  • Solo las twigs de hotfix se fusionan en la release/{version} twig.
  • Antes de abrir una nueva release/{version} twig 2-3 versión anterior, las twigs de release se fusionan con el master por lo que todas las revisiones de estas versiones anteriores también están en la nueva versión.
  • Las revisiones de la versión anterior no están permitidas una vez que se abre la release/{version} twig.

¿Dónde está el problema?

El problema es mala planificación, pero esto sucede y no se puede evitar. Digamos que negociamos con un cliente (B) y decidimos darles la versión 1.0, que estaría abriendo una sucursal haciendo que sea la release/B_v1.0 mientras desarrollamos este cliente en esta sucursal, el time pasa y nuestro equipo de equipo abre el sprint otra release , por ejemplo 1.1. Algunas veces, el process de desarrollo del cliente toma suficiente time para que el producto abra, si no una, dos o tres nuevas release/{version} . Entonces, si esto sucede, la administración y el cliente pueden decidir lanzar una versión más nueva (digamos 1.3, anteriormente fue desarrollado para 1.0). Ahora lo que se tiene que hacer es que tenemos que abrir la twig de la release/1.3 para este cliente y luego fusionar la twig abierta previamente – eso sería hacer una release/B_1.0 --> release/B_1.3 fusión release/B_1.0 --> release/B_1.3 y esto puede ser DOLOROSO de estar hecho. ¿Por qué?

Debido a que la release/B_1.0 se actualiza ocasionalmente con la release/1.0 esto significa que todas las revisiones de la versión 1.0 estarán en la release/B_1.0 (esto no se puede evitar ya que algunas revisiones son cruciales para el desarrollo del cliente) y cuando llega el momento de fusionar la release/B_1.0 --> release/B_1.3 esto includeá todas estas revisiones de la versión 1.0 en la release/B_1.3 y más tarde cuando se release/B_1.3 --> release/1.3 fusión se includeá en la versión 1.3, que está prohibida.


¿Qué hago en situaciones como esta?

release/B_1.0 todas las confirmaciones / fusiones, que estaban en la release/B_1.0 y no son las revisiones que salieron de la release/1.0 , en la release/B_1.3 pero esto puede llevar mucho time y se pueden cometer errores también debido a la hecho de cómo funciona la historia de git.

Propuse que estas sucursales de clientes se puedan bloquear para la confirmación, por lo que solo se fusionarán y cuando se pueda realizar este tipo de combinación, puedo seleccionar fácilmente las fusiones de las twigs relevantes (ignorando las fusiones de la release/{version} ) y no preocuparse por dejar los compromisos finales, pero esto significa que todos los que trabajan en esta twig tienen que crear su propia sucursal y fusionarla en ella, lo que en cierto modo ralentiza el process de desarrollo, en mi opinión.

¿Tiene alguna otra sugerencia que facilite tales fusiones?

¿Por qué no administrar estos clientes para diferentes repositorys git?

Administrar todos los clientes en un repo de git parece eficiente, pero en realidad no lo es. Y basado en que todos los clientes tienen los mismos requisitos / errores o debe negociarlos para sincronizar con el otro.

Así que será mejor que los administres por separado. Incluso si dos clientes tienen las mismas funciones, puede usar las funciones de repositorys cruzados fácilmente:

 # In repoA git remote add B <URL for repo B> -f gitk --all # find the commit of repoB you want to use in repoA git cherry-pick <commit in repoB>