Nota: Minha pergunta está focada no meu problema específico (que envolve o Liferay), mas espero que possa ser útil para quem precisa manter várias versões de um mesmo projeto no git.
Eu trabalho em uma empresa que escreve muitos plugins para o Liferay Portal . Esses plugins (portlets, temas etc.) geralmente são reutilizáveis e, é claro, devem ser atualizados para novas versões do portal.
No entanto, é comum ter que migrar, digamos, um portlet para uma nova versão do Liferay e manter sua versão anterior. Além disso, frequentemente precisamos criar personalizações muito específicas para alguns clientes, o que não faz sentido para ser adicionado à "versão principal".
Esses requisitos complicam nosso trabalho, mas, felizmente, podemos assumir algumas simplificações. Por exemplo, os plugins são atualizados com freqüência por apenas um programador por vez. É muito raro ter dois ou mais recursos sendo adicionados a um plug-in ao mesmo tempo.
Agora, estamos migrando para Gitorious . Estamos tentando conceber um modelo de ramificação para esse cenário.
Meu modelo
O que eu propus foi:
- Cada plug-in teria seu próprio repositório no Gitorious dentro de um projeto. Por exemplo, um portlet para exibir gatinhos teria um
kittens-portlet
repositório dentro doliferay-portlets
projeto. - Ao criar um novo plug-in, crie-o em uma ramificação nomeada de acordo com a versão do Liferay (por exemplo,
lf5.2
). - Sempre que uma atualização é feita no plug-in, a atualização é aprovada e implantada na produção, marque o plug-in com uma versão (por exemplo
lf5.2v1
,lf5.2v2
etc.) * - Sempre que um plug-in deve ser portado para uma nova versão do Liferay, ramificamos a versão mais recente (criando, por exemplo, a ramificação
lf6.0
). - Uma vez em produção, o chefe da nova filial receberá uma tag como
lf6.0v1
. - Sempre que precisamos personalizar um plug-in de uma maneira específica do cliente, criamos uma filial com o nome do cliente (por exemplo, criaríamos uma filial
lf5.2clientcorp
para o nosso cliente "ClientCorp Inc.")
Esse é um modelo incomum: ele não teria master
muitos ramos que não se fundem. É assim que suponho que um repositório com esse modelo se pareceria com:
Um amigo achou esse sistema bastante complexo e propenso a erros. Ele sugeriu o excelente e popular modelo de Vincent Driessen , que achei ainda mais difícil de gerenciar e disciplinar. É ótimo (e testado!), É claro, mas parece complexo demais para a nossa situação.
Modelo do meu amigo
Em seguida, ele sugeriu outro modelo: teríamos um repositório para cada plugin em uma versão do Liferay (para começarmos a criar um kittens-lf5.2-portlet
e depois a kittens-lf6.0-portlet
), cada um com um master
ramo e um develop
ramo. O master
estaria sempre pronto para implantação. (Ou pode ser o contrário master
e stable
, como sugerido por Steve Losh ).
Isso é muito simples, mas eu não gostei deste sistema:
- isso pode resultar em muitos repositórios em um projeto, dificultando a navegação no Gitorious.
- O nome do diretório do projeto é relevante. Se alguém clonar o repositório em um
kittens-lf6.0-portlet
diretório e gerar o WAR com ant (como de costume), o nome do WAR também serákittens-lf6.0-portlet
. As versões antigas deste portlet (nomeadaskittens-portlet
por exemplo) seriam consideradas portlets diferentes (e provavelmente ausentes) em um portal atualizado. Um pouco de cuidado pode evitá-lo, mas eu preferiria evitá-lo. - As diferentes versões do mesmo plugin seriam mantidas separadas. Eu quebro meu coração :(
kittens-lf6.0-portlet
é um nome feio para um repositório, eu acho.
Suspeito que os dois últimos pontos - que também são os mais subjetivos - sejam a principal razão da minha falta de vontade. No entanto, todas as quatro objeções permanecem.
OTOH, minha própria proposta parece estranha para mim e me pergunto se há bugs ocultos nela. O OT3rdH git é tão poderoso e flexível que acho que não deveria ter vergonha de explorar suas possibilidades.
Então eu pergunto:
- Qual seria o melhor modelo? Minha proposta? Modelo do meu amigo? O agora tradicional sistema Vincent Driessen?
- Que outro modelo de ramificação você sugeriria?
- Se você acha que meu modelo é ruim, por que você acha? Gostaria muito de saber quais são as desvantagens e pontos cegos.
* Na verdade, eu preferiria marcar o commit com uma versão como, v1
mas aparentemente um tag no git não está no escopo da ramificação - ou seja, eu não poderia ter uma v1
tag 1 lf5.2
e outra dentro lf6.0
- então eu tenho que nomear o ramo. BTW correto?