Nota: la mia domanda è focalizzata sul mio problema specifico (che coinvolge Liferay) ma spero che possa essere utile per chiunque abbia bisogno di mantenere su git varie versioni di uno stesso progetto.
Lavoro in un'azienda che scrive molti plugin per Liferay Portal . Questi plugin (portlet, temi, ecc.) Sono generalmente riutilizzabili e, ovviamente, dovrebbero essere aggiornati per le nuove versioni del portale.
Tuttavia, è normale migrare, diciamo, un portlet a una nuova versione di Liferay e mantenere la versione precedente. Inoltre, spesso dobbiamo creare personalizzazioni molto specifiche per alcuni client, il che non ha senso essere aggiunto alla "versione principale".
Questi requisiti complicano il nostro lavoro ma, fortunatamente, possiamo assumere alcune semplificazioni. Ad esempio, i plug-in vengono aggiornati frequentemente da un solo programmatore alla volta. È molto raro che due o più funzioni vengano aggiunte contemporaneamente a un plug-in.
Ora stiamo migrando verso Gitorious . Stiamo cercando di concepire un modello di ramificazione per un tale scenario.
Il mio modello
Quello che ho proposto era:
- Ogni plugin avrebbe il suo repository in Gitorious all'interno di un progetto. Ad esempio, un portlet per la visualizzazione di gattini avrebbe un
kittens-portlet
repository all'interno delliferay-portlets
progetto. - Quando si crea un nuovo plug-in, crearlo in una succursale denominata in base alla versione di Liferay (ad esempio
lf5.2
). - Ogni volta che viene eseguito un aggiornamento sul plug-in, l'aggiornamento viene approvato e distribuito in produzione, contrassegnare il plug-in con una versione (ad esempio
lf5.2v1
,lf5.2v2
ecc.) * - Ogni volta che un plugin deve essere portato su una nuova versione di Liferay, ramifichiamo la versione più recente (creando, ad esempio, il ramo
lf6.0
). - Una volta in produzione, il capo della nuova filiale riceverà un tag come
lf6.0v1
. - Ogni volta che dobbiamo personalizzare un plugin in un modo specifico per il cliente, creiamo una filiale con il nome del client (ad esempio,
lf5.2clientcorp
creeremmo una filiale per il nostro client "ClientCorp Inc.")
Questo è un modello insolito: non avrebbe master
molti rami che non si fondono. Questo è come suppongo che un repository con tale modello sarebbe simile a:
Un amico ha trovato questo sistema piuttosto complesso e soggetto a errori. Ha suggerito l'eccellente e popolare modello di Vincent Driessen , che ho trovato ancora più difficile da gestire e disciplinare. È ottimo (e testato!) Ovviamente ma sembra troppo complesso per la nostra situazione.
Il modello del mio amico
Quindi ha suggerito un altro modello: avremmo avuto un repository per ogni plugin in una versione di Liferay (quindi avremmo iniziato a creare a kittens-lf5.2-portlet
e poi a kittens-lf6.0-portlet
), ognuno con un master
ramo e un develop
ramo. Il master
sarebbe sempre pronto per la distribuzione. (O potrebbe essere il contrario, master
e stable
, come suggerito da Steve Losh ).
Questo è molto semplice, ma questo sistema non mi è piaciuto:
- potrebbe comportare un sacco di repository in un progetto, rendendo difficile la navigazione di Gitorious.
- Il nome della directory del progetto è rilevante. Se qualcuno clona il repository su una
kittens-lf6.0-portlet
directory e genera la WAR con ant (come al solito), lo sarà anche il nome WARkittens-lf6.0-portlet
. Le vecchie versioni di questo portlet (chiamatokittens-portlet
ad esempio) verrebbero considerate portlet diversi (e probabilmente mancanti) in un portale aggiornato. Un po 'di cura può evitarlo, ma preferirei evitarlo. - Le diverse versioni dello stesso plugin verrebbero mantenute separate. Mi spezzo il cuore :(
kittens-lf6.0-portlet
è un brutto nome per un repository, credo.
Sospetto che gli ultimi due punti - che sono anche i due più soggettivi - siano la ragione principale della mia riluttanza. Tuttavia, tutte e quattro le obiezioni sono valide.
OTOH, la mia proposta mi sembra strana e mi chiedo se ci siano bug nascosti. OT3rdH git è così potente e flessibile che penso che non dovrei provare vergogna nell'esplorarne le possibilità.
Quindi chiedo:
- Quale sarebbe il modello migliore? La mia proposta? La modella del mio amico? L'ormai tradizionale sistema Vincent Driessen?
- Quale altro modello di ramificazione suggeriresti?
- Se pensi che il mio modello sia cattivo, perché lo pensi? Mi piacerebbe imparare quali sono gli svantaggi e i punti ciechi.
* In realtà, preferirei contrassegnare il commit con una versione come, v1
ma a quanto pare un tag in git non ha ambito nel ramo - cioè, non potrei avere un v1
tag 1 in lf5.2
e un altro in lf6.0
- quindi devo nominare il ramo. È corretto BTW?