Mi sono posto di recente la stessa domanda.
Nel nostro progetto, manteniamo un ramo per ogni versione principale dell'applicazione. Presumo che questi siano gli stessi "rami di produzione" di cui parli. Li chiamiamo "rami di manutenzione", qui.
Il mio primo pensiero è stato quello di eliminare completamente il ramo% di% di mercurial e avere un ramo per ogni versione principale. Questo porterebbe a questa struttura:
branch tag
o v2 2.2
o | v3
| o v2 2.1
|/
o v2 2.0
|
| o v1 1.1
o | v2
| o v1
|/
o v1 1.0
|
o v1
Funziona, ma c'è un lato negativo di questo approccio: se cloni un repository come questo, un semplice default
non farà nulla, poiché il ramo hg update
non esiste più. Personnamente, mi aspetto di essere nell'ultimo stato di sviluppo, dopo aver eseguito un default
.
Alla fine, abbiamo scelto questa struttura:
branch tag
o maintenance-V2 2.2
o | default
| o maintenance-V2 2.1
|/
o default 2.0
|
| o maintenance-V1 1.1
o | default
| o maintenance-V1
|/
o default 1.0
|
o default
Il ramo hg update
è il ramo di sviluppo e l'altro è quello di manutenzione della versione. L'esecuzione di un default
ti porta all'ultimo mix hg update
, che in questo esempio è il prossimo V3.