Nota: Mi pregunta se centra 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 mantener su versión anterior. Además, con frecuencia tenemos que crear personalizaciones muy específicas para algunos clientes, lo que no tiene sentido agregar a la "versión principal".
Estos requisitos complican nuestro trabajo pero, afortunadamente, podemos asumir algunas simplificaciones. Por ejemplo, los complementos son actualizados frecuentemente 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 ramificación para tal escenario.
Mi modelo
Lo que propuse fue:
- Cada complemento tendría su propio repositorio en Gitorious dentro de un proyecto. Por ejemplo, un portlet para mostrar gatitos tendría un
kittens-portletrepositorio dentro delliferay-portletsproyecto. - Al crear un nuevo complemento, créelo en una rama nombrada según la versión de Liferay (por ejemplo,
lf5.2). - 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.2v2etc.) * - Cada vez que un complemento se debe portar a una nueva versión de Liferay, ramificamos la versión más reciente (creando, por ejemplo, la ramificación
lf6.0). - Una vez en producción, el jefe de la nueva sucursal recibirá una etiqueta como
lf6.0v1. - 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, creamos una rama
lf5.2clientcorppara nuestro cliente "ClientCorp Inc.")
Este es un modelo inusual: no tendría ni mastermuchas ramas que no se fusionaran. Así es como supongo que se vería un repositorio con dicho modelo:

Un amigo encontró este sistema bastante complejo y propenso a errores. Sugirió el excelente y popular modelo Vincent Driessen , que encontré aún más difícil de manejar y exigente de disciplina. Es genial (¡y probado!), Por supuesto, pero parece demasiado complejo para nuestra situación.
Modelo de mi amigo
Luego sugirió otro modelo: tendríamos un repositorio para cada complemento en una versión de Liferay (por lo que comenzaríamos a crear ay kittens-lf5.2-portletluego a kittens-lf6.0-portlet), cada uno con una masterrama y una developrama. El mastersiempre estaría listo para el despliegue. (O podría ser al revés mastery stable, como lo sugirió Steve Losh ).
Esto es muy simple, pero no me gustó este sistema:
- podría resultar en una gran cantidad de repositorios en un proyecto, haciendo que Gitorious sea difícil de navegar.
- El nombre del directorio del proyecto es relevante. Si alguien clona el repositorio en un
kittens-lf6.0-portletdirectorio y genera el WAR con hormiga (como de costumbre), el nombre WAR también lo serákittens-lf6.0-portlet. Las versiones antiguas de este portlet (nombradokittens-portletpor ejemplo) se considerarían portlets diferentes (y probablemente faltantes) en un portal actualizado. Un poco de cuidado puede evitarlo, pero preferiría evitarlo. - Las diferentes versiones del mismo complemento se mantendrían separadas. Me rompo el corazón :(
kittens-lf6.0-portletEs un nombre feo para un repositorio, creo.
Sospecho que los dos últimos puntos, que también son los dos más subjetivos, 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 sentir vergüenza al explorar sus posibilidades.
Entonces pregunto:
- ¿Cuál sería el mejor modelo? ¿Mi propuesta? ¿La modelo de mi amiga? ¿El sistema tradicional de Vincent Driessen?
- ¿Qué otro modelo de ramificación sugeriría?
- Si crees que mi modelo es malo, ¿por qué lo crees? Me encantaría saber cuáles son los inconvenientes y los puntos ciegos.
* En realidad, preferiría etiquetar el commit con una versión como, v1pero aparentemente una etiqueta en git no tiene alcance en la rama, es decir, no podría tener una v1etiqueta 1 lf5.2y otra adentro lf6.0, así que tengo que nombrar el rama. ¿Es correcto, por cierto?