Come determinare quando aprire un nuovo ramo o un nuovo repository quando si utilizza Git?

7

Attualmente sto lavorando a un progetto per realizzare un prodotto per l'azienda X. Il team con cui lavoro sta vendendo un servizio simile a molte aziende con prodotti simili, dove il 40% del codice viene riutilizzato e il 60% è personalizzato per società particolare. In precedenza non esisteva il controllo della versione finché non suggerisco di utilizzare git di recente. Siamo felici di non aver più bisogno di copiare e incollare il lavoro a vicenda ripetutamente dopo aver introdotto Git, ma ora siamo un po 'confusi che il nuovo progetto dovrebbe essere aperto come una nuova filiale del repository del prodotto precedente (cioè un repository per tutti i prodotti a società diverse) o come nuovo repository autonomo (ovvero un repository per prodotti diversi)

Normalmente non stiamo unendo i prodotti di diverse società, ma a volte quando troviamo alcune funzionalità buone e volutamente ricercate, vorremmo aggiungere quelle caratteristiche a tutti i prodotti di diverse società come regalo (una o due volte all'anno ). In questo caso, sarà meglio aprire un nuovo repository o semplicemente iniziare un nuovo ramo?

    
posta cytsunny 30.12.2015 - 11:28
fonte

4 risposte

9

40% of the code is reused and 60% customized feature made to particular company

Questo potrebbe richiedere un po 'di tempo per arrivare al punto in cui puoi farlo, ma penso che dovrebbe essere un obiettivo estrarre quel 40% e renderlo il proprio repository. Questa è la tua libreria / framework principale da cui lavorare.

Quindi, quell'altro 60% può essere in repository dedicati su base client.

Sembra che il tuo codice base si qualifichi come "legacy", quindi consiglio vivamente di prendere in considerazione Lavorare efficacemente con il codice legacy di Michael Feathers per te e il tuo team. Fornisce le tecniche per portare il codice sotto test, che può anche essere usato per creare un piano per estrarre il codice in una libreria.

Come faresti a fare questo a partire da adesso? Ecco cosa farei:

  1. Trasforma ogni client nel proprio repository (o, se stai utilizzando qualcosa come Github o Gitlab per gestire i repository git e hai diversi repository per un client, puoi creare un'organizzazione per client, ma supponiamo 1 repository per client).
  2. Prendi un corso che riuso molto ed estrailo (assumendo un approccio orientato agli oggetti, sebbene uno funzionale dovrebbe avere principi simili). Lo useremo per avviare il repository della libreria (ciò lo rende utile dal primo giorno). Se non hai ancora classi complete, allora è qui che entra in gioco il libro di Feathers, che ti mostra come creare classi con codice non classificato. Mentre ci siamo, possiamo aggiungere alcuni test di base per assicurarci che faccia ancora ciò che ci aspettiamo che faccia.
  3. Impegnare questa estrazione come propria cosa e utilizzarla come modello per replicare la modifica su tutti i repository.
  4. Quando incontro parti condivise, le estraggo e le aggiungo al deposito di questa libreria.
  5. Man mano che la libreria cresce e trovo le cose che vengono utilizzate da alcuni client, ma non da altri, posso lavorare su un approccio modulare, in cui le funzionalità più estese vengono estratte nei loro repository e incluse come "moduli" o "plug-in" "al sistema principale. In alternativa, se ci sono temi per particolari gruppi di elementi (come un gruppo che si occupa di autenticazione o elaborazione dei pagamenti), posso estrarli nei loro repository. Come vai, esattamente, in questa fase dipende dalla natura del tuo codice e dalla direzione che vuoi seguire.

Il vantaggio di questo sistema è che tutto ciò che devi fare è aggiungere quell'elemento condiviso nella libreria e collegare tutti gli hook necessari per farlo funzionare, ed è disponibile per tutti i client, non è necessaria la copia-pasta!

Perché questo invece di rami? Mentre tecnologicamente, le filiali non sono molto diverse dai repository autonomi, le convenzioni differiscono tra loro. Un repository è un progetto completo (con riferimenti di qualche tipo, tramite sottomoduli o script, alle dipendenze), mentre un ramo è generalmente un dato stato del progetto. Si dirama quando si desidera aggiungere una funzionalità, correggere un bug o apportare un altro tipo di modifica, ma il sistema stesso è considerato lo stesso. Crei un nuovo repository quando il progetto è considerato diverso (in questo caso, per un client diverso, con le sue personalizzazioni e quant'altro).

Un buon esempio di questo è Oracle OpenOffice vs LibreOffice. LibreOffice è un fork di OpenOffice, ed è mantenuto anche dalle stesse persone. Tuttavia, LibreOffice, anche quando era tecnologicamente identico a OpenOffice (quando era stato inizialmente biforcato), era considerato un prodotto diverso. Il team ha quindi rimosso il marchio Oracle e avviato il percorso di sviluppo di LibreOffice, che ora è distinto da OpenOffice. Mentre le modifiche apportate a LibreOffice potrebbero essere entrate in una diramazione in OpenOffice, dal momento che LibreOffice è considerato un progetto diverso, ha invece bisogno del proprio repository.

    
risposta data 30.12.2015 - 17:08
fonte
1

Concettualmente, non c'è molta differenza tra le tue scelte. Finché disponi di un antenato comune, puoi recuperare i rami da due repository e unire / diff / qualsiasi altro tra loro.

La principale differenza è nel controllo degli accessi. È abbastanza facile controllare l'accesso a livello di pronti contro termine e piuttosto difficile a livello di filiale. Se si desidera fornire ai client l'accesso solo al proprio codice, è necessario creare il proprio repository.

Certo, puoi fare entrambe le cose. Internamente puoi avere un singolo ramo per ogni cliente e avere uno script che spinga solo quel ramo su un repository esterno a cui il cliente può accedere.

Tuttavia, mantenere una filiale separata per cliente non è generalmente il modo migliore per progettare il codice. Rende molto difficile mantenere in seguito. Di solito è molto più sostenibile a lungo termine dividere il codice in moduli comuni riutilizzabili che sono tutti in master , quindi ogni cliente riceve una piccola parte personalizzata che attira i moduli. Cerca di inserire il maggior numero possibile di codice nei moduli comuni.

    
risposta data 30.12.2015 - 14:47
fonte
1

Ci sono due problemi separati nella tua domanda:

  1. Avviare il nuovo prodotto nello stesso repository o aprirne uno nuovo?

Questa è una questione di gusti. Alcuni mantengono tutti i prodotti in un unico repository gigante, altri aprono un nuovo repository per ogni unità separata (anche se contiene solo un singolo file). Alcuni trovano un salutare equilibrio tra i due estremi.

Per ora direi di mettere le tue librerie comuni in un repository e ogni prodotto finale non correlato nel proprio repository.

  1. Apri una nuova filiale o apri un nuovo repository?

Questa non dovrebbe mai essere la domanda. Si può decidere di inserire il nuovo prodotto nello stesso pronti contro termine. In tal caso, apri un nuovo ramo (feature), inizia a sviluppare il prodotto lì e, quando è stabile, lo unisci al ramo principale ed elimina il ramo di funzione .

La maggior parte delle volte puoi pensare ai rami git come a lunghi commit. Alla fine verranno uniti al ramo principale e tu li cancellerai.

D'altra parte ci sono rami di manutenzione persistenti. Ma non farai alcun sviluppo di funzionalità su di loro.

Quindi la mia risposta è: potresti decidere di aggiungere il nuovo prodotto allo stesso repository (con il nuovo prodotto anche vivendo nel ramo principale) o creare un nuovo repository per esso. Ma non abusare del meccanismo di ramificazione per sviluppare un prodotto separato nello stesso repository.

Ti consiglio di controllare Atlitian's Git Tutorials

    
risposta data 30.12.2015 - 18:45
fonte
-2

In realtà è incoraggiato a creare un ramo ogni volta che vuoi. Ecco alcuni suggerimenti potrebbero essere utili:

  1. quando stai sperimentando una nuova idea sulla base di codice
  2. quando stai provando a correggere un bug
  3. quando tenti di refactoring il tuo codice
  4. quando ti unisci a un ramo esterno
  5. quando si risolvono i conflitti
  6. stai facendo una nuova versione
  7. vuoi solo creare un punto di salvataggio per lo stage corrente

Potrebbe esserci una lunga lista. Puoi mantenere un elenco di filiali TOPIC per il tuo gruppo.

    
risposta data 30.12.2015 - 12:15
fonte

Leggi altre domande sui tag