Questa è una domanda sulle migliori pratiche e mi aspetto che la risposta sia "dipende". Spero solo di imparare più scenari e flussi di lavoro nel mondo reale.Come gestire lo sviluppo concorrente con mercurial?
Prima di tutto, sto parlando di diversi cambiamenti per lo stesso progetto, quindi nessun subrepo per favore.
Supponiamo di avere il codice base in un repository hg. Inizi a lavorare su una nuova caratteristica complicata A, poi un bug complicato B viene segnalato dal tuo tester di fiducia (hai i tester, giusto?).
E 'banale se (la correzione per) B dipende da A. È simlply CI a poi ci B.
La mia domanda è che cosa fare quando sono indipendenti (o almeno sembra ora).
mi vengono in mente dei seguenti modi:
- Utilizzare un clone separato per B.
- Utilizzare i rami anonimi o con nome, o segnalibri, nello stesso repository.
- Utilizzare MQ (con patch B in cima a A).
- Usa MQ ramificato (ti spiegherò più avanti).
- Uso MQ multipla (dal 1,6)
1 e 2 sono coperti da un excellent blog da @Steve Losh collegato da un slightly related question.
L'enorme vantaggio di 1 rispetto alle altre scelte è che non richiede alcuna ricostruzione quando si passa dal lavorare su una cosa all'altra, perché i file sono fisicamente separati e indipendenti. Quindi è davvero l'unica scelta se, ad esempio, A e/o B toccano un file di intestazione che definisce un booleano a tre stati ed è incluso in migliaia di file C (non dirmi che non hai visto un codice legacy simile base).
3 è probabilmente il più semplice (in termini di configurazione e sovraccarico), e è possibile capovolgere l'ordine di A e B se B è una correzione piccola e/o urgente. Tuttavia può diventare complicato se A e B toccano lo stesso file (s). È facile risolvere i problemi con le patch che non si sono verificate se le modifiche A e B sono ortogonali all'interno degli stessi file, ma concettualmente è ancora un po 'rischioso.
4 può dizzy ma è il modo più potente, flessibile e scalabile. Io default hg qinit
con -c
dato che voglio contrassegnare le patch work-in-progress e spingerle/tirarle, ma ci vuole un salto concettuale per rendersi conto che è possibile anche diramare in repo MQ.Ecco i passaggi (mq = hg --mq):
hg qnew bugA
; apportare modifiche per A;hg qref
mq branch branchA; hg qci
hg qpop; mq up -rtip^
hg qnew bugB
; apportare modifiche per B;hg qref
mq branch branchB; hg qci
- di lavorare su un nuovo:
hg qpop; mq up branchA; hg qpush
sembra folle di prendere tanti passi, e ogni volta che avete bisogno di cambiare lavoro è necessario hg qci; hg qpop; mq up <branch>; hg qpush
. Considerate questo: avete diversi rami di rilascio con nome nello stesso repository, e avete bisogno di lavorare su diversi progetti e correzioni di bug allo stesso tempo per tutti loro (è meglio avere un bonus garantito per questo tipo di lavoro). Ti perderei molto presto con gli altri approcci.
Ora i miei amici hg amanti, ci sono altre/alternative migliori?
(UPDATE) qqueue
quasi fa # 4 obsoleti. Vedere l'elegante descrizione di Steve Losh here.
Come se non fosse ovvio, sto chiedendo un approccio basato su hg. Ma se puoi darmi un singolo comando da un altro SCM che funziona in tutti i casi, sto abbandonando hg. Consideralo una sfida, git aficionados. –
Penso che sia necessario specificare il problema un po 'meglio. Perché questo non funziona in tutti i casi: correggi il bug A, commetti la sua patch, correggi bug B, commetti la sua patch? – Karmastan
Mi dispiace di aver perso un po ', Spolsky-ishly. Ho menzionato un caso semplice: "se B è una correzione piccola e/o urgente". Una situazione più realistica è che A e B sono entrambi progetti lunghi che richiedono un sacco di commit e iterazioni. Inoltre, se hai una procedura di revisione del codice come fa la mia azienda, potresti aver terminato A e averlo inviato per la revisione, e non puoi stare lì a giocherellare con i pollici in attesa dei revisori, quindi devi andare a prendere B nel frattempo . Ma poi il revisore potrebbe far saltare il tuo codice e devi fare delle modifiche per compiacerlo/lei. Quindi ci possono essere innumerevoli interruttori di progetto lungo la strada. –