È buona norma utilizzare le filiali per mantenere diverse edizioni dello stesso software?

67

Abbiamo un prodotto con diverse edizioni. Le differenze sono minori: stringhe diverse qua e là, poca logica aggiuntiva in una, poca differenza di logica nell'altra. Quando il software è in fase di sviluppo, è necessario aggiungere la maggior parte delle modifiche a ogni edizione; tuttavia, ce ne sono alcuni che no e alcuni che devono essere diversi. È un uso valido delle filiali se ho delle diramazioni release-editionA e release-editionB (..etc)? Ci sono trucchi? Buone abitudini?

Aggiornamento: grazie per l'intuizione di tutti, molte buone risposte qui. Il consenso generale sembra essere che sia una cattiva idea utilizzare i rami per questo scopo. Per chiunque si chieda, la mia soluzione definitiva al problema è esternalizzare le stringhe come configurazione e esternalizzare la logica diversa come plugin o script.

    
posta Tamás Szelei 13.02.2012 - 09:18
fonte

8 risposte

43

Questo dipende dalla grandezza del cambiamento, ma non lo considererei una buona pratica per le differenze che hai descritto.

In generale, si desidera che un ramo Git sia qualcosa che verrà unito in futuro o memorizzato in sola lettura come riferimento. I rami di Git che coesistono indefinitamente significano lavoro per tutti: i cambiamenti devono essere propagati e fusi, i conflitti risolti, tutto il divertimento. Se non altro, ogni sviluppatore deve ricordare di trasferire le modifiche a cinque repository invece di uno.

Se si hanno piccole modifiche, l'intero sforzo di fusione e mantenimento delle filiali sembra eccessivo rispetto al problema. Usa il tuo preprocessore o sistema di compilazione per differenziare tra le versioni. Un semplice #ifdef fa il trucco? Quindi non risolvere i problemi con git, è eccessivo.

    
risposta data 13.02.2012 - 09:28
fonte
16

Questo non è esattamente ciò che i rami servono. Si suppone che i rami siano percorsi secondari di breve-medio periodo verso la linea di sviluppo, non versioni parallele a lungo termine dello stesso codice.

Metterei tutte le diverse versioni nello stesso ramo, con una sottodirectory per le parti che sono diverse tra le edizioni e impostare il processo di compilazione (hai una build automatizzata, giusto?) in modo che possa produrre sia edizione su richiesta (o tutte in una volta).

Dopotutto, vuoi mantenere una "singola fonte di verità"; con le filiali, dovrai duplicare del codice, ma non tutto, e alcune fusioni potrebbero infatti interrompere la configurazione.

    
risposta data 13.02.2012 - 09:40
fonte
11

Una soluzione, come hanno sottolineato le persone, è configurare il sistema di generazione per supportare diverse versioni.

Prenderò in considerazione l'implementazione come comando di attivazione e utilizzo di un file di configurazione. Meno devi costruire, meglio è.

Dai un'occhiata a questo sito

    
risposta data 13.02.2012 - 11:05
fonte
3

Penso che sia una buona idea, a patto di non poterlo fare all'interno di un ramo senza mettere in cluster il codice.
Preferirei essere in grado di tenerlo in un ramo e usare file localizzati e di configurazione, specialmente se dici che le differenze sono minori.
Un altro modo potrebbe essere diverse build, ad esempio il file di build racchiude file diversi per clienti diversi, ma posso anche vedere lo strumento di compilazione che controlla i vari rami. Mentre usi git direi senza trucchi reali. Una strategia di ramificazione potrebbe essere quella di svilupparsi su rami diversi per compiti diversi, registrarsi al ramo master e unire da master a editionX e Y.

    
risposta data 13.02.2012 - 09:27
fonte
2

Sembra più un lavoro per diverse configurazioni di build. la risposta di thiton va in questa direzione, ma la prenderei molto più lontano di #ifdef :

Utilizza diversi obiettivi di compilazione per creare diverse versioni del software. I target possono differire di

  • la configurazione che includono,
  • l'oggetto o i file sorgente che includono o
  • la preelaborazione del codice sorgente.

Questa pre-elaborazione può ovviamente includere il preprocessore C classico ma potrebbe anche comportare l'uso di un preprocessore personalizzato, un motore di template per costruire visualizzazioni personalizzate, ...

In questo modo eviti di dover spingere attivamente ogni singola modifica a più rami, il che viola DRY (ovviamente anche questo può essere automatizzato ma non ne vedo il vantaggio).

    
risposta data 13.02.2012 - 14:06
fonte
1

Userei le filiali solo per cambiamenti significativi, altrimenti finisci per aggiungere ogni piccola modifica a numerosi rami, che non è affatto divertente da fare ed è molto soggetta a errori, specialmente se lavori con più persone.

    
risposta data 13.02.2012 - 09:32
fonte
1

Se li stai rilasciando tutti come prodotti diversi, è consigliabile avere più filiali. In caso contrario, si consiglia comunque di utilizzare qualcosa come un tronco o un ramo principale.

Inoltre, penso che ciò dipenderà dal processo di sviluppo che hai, in particolare dalla distribuzione. Se si dispone di un processo che consente solo il passaggio di un ramo alla produzione e i rami vengono trattati come "build incrementali", il rilascio B non può essere distribuito in produzione a meno che la versione A non sia stata rilasciata per prima, dato che tutte le modifiche di A sono già in B, quindi avere più filiali è la strada da percorrere. Questo funzionerà se hai squadre sparse in tutto il mondo e di solito hai modifiche ordinate per priorità.

    
risposta data 13.02.2012 - 10:15
fonte
-2

La soluzione con i tre diversi rami (per produzione, sviluppo e funzionalità) funziona davvero bene. Diciamo che hai scoperto qualche bug nel tuo codice di produzione, quindi puoi applicare una patch a quella quindi rilasciarla. Assicurati solo di non aggiungere alcuna funzionalità al ramo di produzione o eventuali modifiche importanti al ramo di produzione. Tu e il tuo team dovrete auto-disciplinare per non aggiungere nessuna delle principali modifiche alla vostra produzione. Il ramo di produzione dovrebbe essere solo per correzioni di bug minori che non garantiscono una modifica importante nel codice di produzione.

    
risposta data 13.02.2012 - 11:20
fonte

Leggi altre domande sui tag