Come aggiornare correttamente un ramo di caratteristica da tronco?
-
23-09-2019 - |
Domanda
...Another way of thinking about this pattern is that your weekly sync of trunk to branch is analogous to running svn update in a working copy, while the final merge step is analogous to running svn commit from a working copy
Trovo che questo approccio molto poco pratico in grandi sviluppi, per diversi motivi, per lo più legati alla fase di reinserimento.
- Da SVN v1.5, la fusione è fatto rev-by-rev. Cherry-picking le aree da essere uniti noi causerebbe per risolvere i conflitti tronco-ramo due volte (una durante l'unione di revisioni tronco alla FB, e ancora una volta quando si unisce di nuovo).
- dimensioni Repository:. Modifiche del tronco potrebbe essere significativo per una grande base di codice, e copiare i file delle differenze (a differenza SVN copia) dal tronco altrove possono essere un grande carico di lavoro
Invece, facciamo quello che noi chiamiamo "ri-ramificazione". In questo caso, quando è necessario un pezzo significativo di modifiche del tronco, un nuovo ramo di caratteristica è aperta dal tronco corrente, e l'unione è sempre verso il basso (rami funzioni -> tronco -> rami stabili). Questo non va lungo le linee guida del libro SVN e gli sviluppatori lo vede come il dolore in più.
Come si fa a gestire questa situazione?
Soluzione 2
Dopo la ricerca:
Dopo molte sessioni di brainstorming a visionmap, discussioni F2F tra cui Artyom, l'apertura di un caso libro SVN, ecc - sembra che questo non è possibile fare. Un ramo funzione non è del tutto come copia di lavoro. L'unico modo per aggiornare lavorare è ricreare un nuovo ramo, come descritto sopra.
Altri suggerimenti
Da SVN v1.5, la fusione è fatto rev-by-rev. Cherry-picking le aree da essere uniti noi causerebbe per risolvere i conflitti tronco-ramo due volte (uno durante l'unione di revisioni tronco alla FB, e ancora una volta quando si unisce di nuovo)
Poi si sta facendo qualcosa di sbagliato!
Vediamo:
trunk fb
---------\
r1-10 |
r11-20 |
r20-30 |
In generale, se si desidera che le modifiche fatte in 11-20, poi le migliori prassi è di fondere 1-20 a FB e ottenere tutto quello che c'è.
Poi, quando fb è fatto, si fondono 20-30 e quindi copia fb al tronco (senza merge!).
Se si decide di unire solo r11: 20, ok, alla fine avrete bisogno di unire r1: 10 e r20: 30 e quindi copia fb al tronco.
Non c'è modo di unire i cambiamenti due volte!
presumo che probabilmente si fa seguenti:
copy trunk->fb
merge 11:20 -> fb.
merge fb-1:30 -> trunk !!!!! WRONG
Non si può fare questo perché si dovrebbe unire 11:20 due volte. Si dovrebbe sempre fondersi codice una sola direzione.
maniera corretta:
copy trunk->fb
merge 1:20 -> fb.
merge 21:30 -> fb (now fb=trunk+feature)
copy fb -> trunk
Modifica
Così i passaggi corretti sono:
-
Create ramo della funzione (FB) dal tronco (tronco copia per caratterizzare ramo con svn-copy)
FB_0=trunk_0
-
Il lavoro su FB.
FB_1=FB_0 + change_a
-
Unisci tutte le diffusioni a modifiche dal tronco di FB.
trunk_1=trunk_0 + tr_change_a; FB_2 = FB_1 + (trunk_1 - trunk_0) == trunk_0 + change_a + tr_change_a
-
Il lavoro su FB
FB_3 = FB_2 + change_b
-
Unisci tutte le diffusioni a modifiche non unite dal tronco a FB.
trunk_2=trunk_1 + tr_change_n; FB_4 = FB_3 + (trunk_2 - trunk_1) == trunk_0 + change_a + change_b + tr_change_a + tr_change_b
-
A questo punto abbiamo un ramo di caratteristica che consiste di tutti le nuove caratteristiche e tutti i cambiamenti in tronco. Così abbiamo appena copiare la differenza tra due rami.
trunk_3 = trunk_2 + (FB_4 - trunk_2) = FB_4 = trunk_0 + change_a + change_b + tr_change_a + tr_change_b
Ora FB cancellato come tronco ha tutte le modifiche di cui abbiamo bisogno.
L'ultimo passo è eseguito da:
svn merge /path/to/trunk@LatestRev /path/to/branches/fb@LatestRev . svn ci
O in ordinaria differenza di lingua prendere tra il tronco e ramo e metterli a tronco rendendoli equivalenti.
Questo modello è descritto in http://svnbook.red-bean.com/en/1.4/svn.branchmerge.commonuses.html#svn.branchmerge.commonuses.patterns.feature
Ora, se questo non funziona per voi, allora non capisco la domanda.
Edit2: Per svn-1.5
Quando si lavora con svn-1.5 è possibile unire più semplice:
Quando si lavora sul ramo funzione basta unire le modifiche di volta in volta il tronco:
$ svn merge /path/to/trunk
Solve conflicts
$ svn ci
Sarà allineare il vostro FB con tutti i cambiamenti in tronco. Alla fine di FB si esegue questa procedura ancora una volta per assicurarsi che tutto è up-to date. La si va al tronco ed eseguire
$ svn merge --reintegrate /path/to/fb
$ svn ci
In ultimo non ci dovrebbero essere conflitti se si sta lavorando, come indicato.
Siamo una piccola azienda, quindi non sa se la nostra soluzione si applica alla vostra situazione. Quello che facciamo è una fusione rev-by-rev dal tronco al ramo stabile. Possiamo farlo in 2 modi diversi: - correzione realmente necessario, ci si fondono solo dopo aver commesso al tronco - Pericoloso correzione / modifica. Aspettiamo qualche giorno fino a quando il cambiamento è reso impermeabile in tronco e poi uniamo
Con questa fusione continuo abbiamo evitare tonnellate di conflitti.
I miei 2 centesimi.
Purtroppo tutto ciò di cui può essere pensato come hack. Aggiornamento da tronco su un ramo può portare a problemi molto seri quando riportandolo in tronco e apre la possibilità per il peggiore di tutti i conflitti, conflitti albero. Questo perché le directory non sono trattati come cittadini di prima classe. L'approccio migliore è quello di utilizzare Mercurial con la SVN estensione come il vostro client standard SVN. Esso consente di continuare a utilizzare SVN mentre ottenere il potere di gestione della cartella di Mercurial.
Poi sul lato wworkstation è possibile utilizzare un certo numero di approcci che fornisce una gamma di funzioni per soddisfare molte situazioni più sola di SVN. È possibile utilizzare l'applicazione di patch regolari, le code di patch, l'aggiornamento da una copia locale del tronco senza influenzare il tronco comune e vari altri approcci.
Questo approccio funziona intorno a tutti i lati downn di SVN. Ho dovuto passare tto a questo approccio a causa di circostanze simili. Anche se non si utilizza questo approccio immediatamente si dovrebbe almeno fare un tentativo al più presto.
Credo di avere a prendere le difese per @Artyom qui. Anch'io penso che se si deve
risolvere i conflitti tronco-ramo due volte
qualcosa non va. E penso che @Artyoms argomento / soluzione è abbastanza solida.
Credo che una delle cose minori @Artyom potuto scrivere più chiaro è che, alla fine, in cui si fb
"copia" per trunk
non si usa svn copy
ma svn merge
(o svn merge --reintegrate
). Questo potrebbe essere il motivo per cui non si trova il modello di "copia-merge" in Patterns Branching comuni .
Come sto lottando con la comprensione che cosa state facendo fino ad ora, non sono sicuro che altro dire.
Ecco quello che ho sentito dire:
Invece, facciamo quello che noi chiamiamo "Ri-ramificazione". In questo caso, quando un significativo pezzo di modifiche del tronco è necessario, un nuovo ramo di caratteristica è aperto dal tronco corrente, ...
Ora avete una nuova filiale (chiamiamolo b2), che è equivalente al tronco, giusto? E , dove è il "pezzo significativo di modifiche del tronco bisogno"? Presumo in fb?
... e l'unione è sempre verso il basso (Rami di funzione -> tronco -.> rami stabili)
Ma, come avete appena creato b2 dal tronco non c'è nulla da fondersi in tronco, no? E non si uniscono le modifiche da B2 a fb o (come questo sarebbe lo stesso che la fusione tronco a FB ...). Quindi, come fare il "significativi pezzi di cambiamenti" entrare in fb? E una volta che sono lì, perché si desidera unire di nuovo al tronco (poiché questo è da dove sono venuti in primo luogo)?
In realtà i seguenti link la sezione chiamata“Monitoraggio Unisce manualmente " e / o di la sezione chiamata“Fusione di un ramo intero ad un altro " fornite nella documentazione di 1.4 SVN (lo so, non si utilizza SVN 1.4 ma credo che si applica in ogni caso) sotto Comune Branching Patterns potrebbe aiutare a chiarire alcune cose. Questi collegamenti sono "scomparsi" nella documentazione di 1.5 (probabilmente a causa della nuova opzione --reintegrate
in merge
).
È davvero sembra di essere la fusione delle stesse modifiche due volte e ho davvero che non si dovrebbe (necessità di) farlo.