Un modello decente di branching git per prodotti che dovrebbe accompagnare la versione di un altro prodotto di terze parti (e pro e contro di una proposta)

13

Nota: La mia domanda si concentra sul mio problema specifico (che coinvolge Liferay) ma spero possa essere utile a chiunque abbia bisogno di mantenere varie versioni di uno stesso progetto su git.

Lavoro in una società che scrive molti plugin per Liferay Portal . Questi plugin (portlet, temi, ecc.) Sono solitamente riutilizzabili e, naturalmente, dovrebbero essere aggiornati per le nuove versioni del portale.

Tuttavia, è normale migrare, diciamo, un portlet a una nuova versione di Liferay e per mantenere la sua 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 plugin vengono aggiornati di frequente da un solo programmatore alla volta. È molto raro che due o più funzioni vengano aggiunte a un plug-in contemporaneamente.

Ora stiamo migrando a Gitorious . Stiamo cercando di concepire un modello di ramificazione per tale scenario.

Il mio modello

Quello che ho proposto è stato:

  1. Ogni plugin avrebbe il proprio repository in Gitorious all'interno di un progetto. Ad esempio, un portlet per la visualizzazione di gattini avrebbe un repository kittens-portlet all'interno del progetto liferay-portlets .
  2. Quando crei un nuovo plug-in, crealo in un ramo chiamato in base alla versione di Liferay (ad esempio, lf5.2 ).
  3. Ogni volta che viene eseguito un aggiornamento sul plug-in, l'aggiornamento viene approvato e distribuito in produzione, taggalo con una versione (ad esempio lf5.2v1 , lf5.2v2 ecc.) *
  4. Ogni volta che un plugin deve essere portato su una nuova versione di Liferay, si dirama la versione più recente (creando, per esempio, il ramo lf6.0 ).
  5. Una volta in produzione, il capo del nuovo ramo riceverà un tag come lf6.0v1 .
  6. Ogni volta che dobbiamo personalizzare un plug-in in modo specifico per il cliente, creiamo un ramo con il nome del client (ad esempio, creiamo un ramo lf5.2clientcorp per il nostro client "ClientCorp Inc.")

Questo è un modello insolito: non avrebbe master e molti rami che non si uniscono. Ecco come suppongo che un repository con tale modello assomigli a:

Unamicohatrovatoquestosistemapiuttostocomplessoesoggettoaerrori.Hasuggeritol'eccellenteepopolare modello Vincent Driessen , che ho trovato ancora più difficile da gestire e disciplinare -demander. È fantastico (e testato!), Ma sembra troppo complesso per la nostra situazione.

Il modello del mio amico

Poi ha suggerito un altro modello: avremmo un repository per ciascun plugin in una versione di Liferay (quindi avremmo iniziato a creare un kittens-lf5.2-portlet e poi un kittens-lf6.0-portlet ), ognuno con un ramo master e un develop branch. Il master sarebbe sempre pronto per la distribuzione. (Oppure potrebbe essere il contrario, master e stable , come suggerito da Steve Losh ).

Questo è molto semplice, ma non mi piaceva questo sistema:

  1. potrebbe risultare in una quantità enorme di repository in un progetto, rendendo difficile la navigazione di Gitorious.
  2. Il nome della directory del progetto è pertinente. Se qualcuno clona il repository su una kittens-lf6.0-portlet dir e genera il WAR con ant (come al solito), anche il nome WAR sarà kittens-lf6.0-portlet . Le versioni precedenti di questo portlet (denominate kittens-portlet ad esempio) sarebbero considerate portlet diversi (e probabilmente mancanti) in un portale aggiornato. Un po 'di attenzione può evitarlo ma preferirei evitarlo.
  3. Le diverse versioni dello stesso plugin sarebbero mantenute separate. Mi spezzo il cuore: (
  4. kittens-lf6.0-portlet è un brutto nome per un repository, penso.

Sospetto che i due ultimi punti, che sono anche i due più soggettivi, siano la ragione principale della mia mancanza di volontà. Tuttavia, tutte e quattro le obiezioni stanno.

OTOH, la mia proposta mi sembra strana e mi chiedo se ci siano bug nascosti su di essa. OT3rdH git è così potente e flessibile che penso che non dovrei provare vergogna nell'esplorare le sue possibilità.

Quindi, chiedo:

  1. Quale sarebbe il miglior modello? La mia proposta? La modella del mio amico? L'ormai tradizionale sistema Vincent Driessen?
  2. Quale altro modello di ramificazione suggeriresti?
  3. Se pensi che la mia modella sia cattiva, perché la pensi così? Mi piacerebbe sapere quali sono gli svantaggi e i punti ciechi.

* In realtà, preferirei taggare il commit con una versione come v1 ma a quanto pare un tag in git non ha scope nel ramo - cioè, non potrei avere un tag dell'1 v1 in lf5.2 e un altro in lf6.0 - quindi devo nominare il ramo. È corretto BTW?

    
posta brandizzi 03.02.2012 - 23:46
fonte

2 risposte

2

Se leggo correttamente i rami sono fondamentalmente una deviazione one-shot dalla tua linea principale di sviluppo, non ho mai voluto essere unificati nella linea principale e gli avanzamenti nella linea principale non si applicano mai a questi rami. L'unica deviazione sarebbe che le correzioni di bug appropriate alla versione su cui si basava il ramo fossero applicate al ramo.

La risposta ora ruota attorno al tuo flusso di lavoro quotidiano, il numero di sviluppatori che lavorano su un singolo ramo o il numero di modifiche sono false. Vedo il tuo bisogno primario di voler sapere quali rami ottengono un aggiornamento di correzione da un cambio di ramo principale e per questo penso che il repository combinato con i rami sarà più efficiente poiché è tutto in un unico posto. Se non ci fosse mai stato bisogno di impollinazione incrociata, i repository separati lo applicherebbero, ma quello scenario non corrisponde alla realtà del tuo progetto perché lo comprendo.

Il modello Driessen funzionerebbe bene se il tuo progetto dovesse ricomporre i rami nella linea principale di sviluppo, ma non è necessario. Anche così penso che ci sia merito nel mantenere un concetto InSevelopment e StableRelease se stai lavorando su un prodotto che è vivo.

Quindi, per riassumere, penso che il tuo progetto funzionerebbe bene con il tuo modello di ramificazione più un pizzico di Driessen per la tua linea principale. Il tuo chilometraggio può variare; Ho sempre lavorato con un ramo "in attesa di rilascio" che si trasforma in un ramo "live" e in una "prossima release" separata che richiedono tutti l'impollinazione incrociata di correzioni e modifiche in vari punti, quindi la mia percezione potrebbe essere distorta.

    
risposta data 07.02.2012 - 01:11
fonte
3

Ciò che mi infastidisce è il fatto che ogni portlet ha il proprio repository (ma la tua storia potrebbe non essere completa). Personalmente vorrei creare un repository per progetto. I progetti hanno spesso più portlet e sono tutti costruiti nella stessa esecuzione rispetto alla stessa versione di Liferay. Ogni progetto può essere un duplicato di un progetto esistente che si basa su una versione diversa di Liferay, ma dividerei un prodotto solo se le differenze sono troppo grandi. Se una build funziona contro Liferay 5.1 e 5.2, non dividerei il progetto. Vorrei usare scripting o Maven (o entrambi) per far funzionare tutto. Vorrei usare un Wiki (o Trello) per la gestione di ogni prodotto e con quale versione di Liferay può essere costruita contro.

A proposito: sono un programmatore Java, specialista di Maven, specialista di Build e ho esperienza con Liferay e altri server di portale (IBM WebSphere e Glassfish).

Ma questo è solo il mio € 0,02.

    
risposta data 08.02.2012 - 07:20
fonte

Leggi altre domande sui tag