Unisci un ramo nel tronco


125

Sto affrontando un problema peculiare con SVN merge. Voglio unirmi da un ramo di sviluppo a un tronco. Abbiamo più rami di sviluppo tagliati contemporaneamente dal tronco.

Unisco uno di quei rami al trunk con questo comando:

svn merge trunk branch_1

Vedo cambiamenti che non fanno parte di questo ramo, che si fondono nel trunk. Che cosa sto facendo di sbagliato ?

Versione SVN:

Client da riga di comando Subversion, versione 1.6.16-SlikSvn-tag-1.6.16@1076804-WIN32.


7
So che questa non è una risposta, ma se hai diversi rami attivi contemporaneamente, probabilmente faresti meglio a passare a mercurial o git. Ps: non sono un fanatico, lavoro con svn da ~ 7 anni ;-)
zerkms,

2
Che vantaggio offre? Perché passare a git o mercurial è una scelta migliore?
Vanchinathan Chandrasekaran,

3
perché git e mercurial hanno un supporto molto migliore dei rami. Vantaggi: non farai tali domande e avrai meno mal di testa nella creazione e nel mantenimento di filiali (attualmente sto lavorando a un progetto con> 1000 filiali, in svn è stato un inferno lavorare con loro)
zerkms,

Consiglio di esaminare Svnmerge.py e di leggere questo articolo .
abito

Risposte:


215

La tua svn mergesintassi è sbagliata.

Vuoi fare il checkout di una copia funzionante di trunke quindi usare l' svn merge --reintegrateopzione:

$ pwd
/home/user/project-trunk

$ svn update  # (make sure the working copy is up to date)
At revision <N>.

$ svn merge --reintegrate ^/project/branches/branch_1
--- Merging differences between repository URLs into '.':
U    foo.c
U    bar.c
 U   .

$ # build, test, verify, ...

$ svn commit -m "Merge branch_1 back into trunk!"
Sending        .
Sending        foo.c
Sending        bar.c
Transmitting file data ..
Committed revision <N+1>.

Vedi il capitolo del libro SVN sull'unione per maggiori dettagli.


Nota che al momento è stata scritta, questa era la risposta giusta (ed è stata accettata), ma le cose sono andate avanti. Vedi la risposta di topek e http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate


4
- l'opzione di integrazione non è obbligatoria, il ramo (in 1.6) può essere unito a qualsiasi destinazione un numero qualsiasi di volte
Lazy Badger

1
Veramente? Senza rischiare di rifare gli stessi changeset? Potete fornire un link a prove corroboranti di questo per favore.
Neutrino,

--reintegratenon è in effetti obbligatorio ma in questo caso è davvero consigliato. Ho provato a farlo senza --reintegratee ho finito con centinaia di conflitti. Con --reintegrate, nessun conflitto e tutto andava bene!
Tibo,

17
L' --reintegrateopzione è semplice ed efficace, MA va notato che "Una volta effettuata l' --reintegrateunione da ramo a tronco, il ramo non è più utilizzabile per ulteriori lavori. Non è in grado di assorbire correttamente le nuove modifiche del tronco, né può essere adeguatamente reintegrato al tronco di nuovo ". come spiegato dal libro che hai collegato.
Pino,

3
@daveL, le fusioni in avanti da un tronco all'altro hanno un senso per me. Tuttavia ho trovato una funzione avanzata per "mantenere in vita un ramo reitegrato" (vedi stackoverflow.com/a/10163059/685806 ), inoltre viene applicata automaticamente dalle versioni client più recenti.
Pino,

78

Se la tua directory di lavoro punta al trunk, dovresti essere in grado di unire il tuo ramo con:

svn merge https://HOST/repository/branches/branch_1

assicurati di emettere questo comando nella directory principale del tuo trunk


7
A partire da SVN 1.8. Questa è la risposta esatta. Vedi subversion.apache.org/docs/release-notes/…
GreenAsJade

@blahdiblah lo snippet di codice ha molte informazioni estranee. C'è una ragione per cui l'astratto degli studi ottiene ordini di grandezza letti più di qualsiasi altra parte di uno studio. Lo stesso vale per i test UX, minimizzando le frequenze di rimbalzo, ecc. È lo stesso principio.
ahnbizcad,

con 1.7 potresti unirti senza l'opzione --reintegrate, e continuare a sviluppare sul ramo e continuare a fondere. Purtroppo, 1.8 costringerà questo a un reinserimento e non sembra esserci un modo per impedirlo. Ciò significa che non appena ti unisci, non puoi utilizzare il ramo senza passare attraverso la temuta "danza viva"
John Little,

3
Non dimenticare di reimpostare la copia di lavoro del trunk nel repository dopo l'unione!
Giovanni,

16

Esegui un aggiornamento svn nel trunk, annota il numero di revisione.

Dal tronco:

svn merge -r<revision where branch was cut>:<revision of trunk> svn://path/to/branch/branchName

Puoi controllare dove è stato tagliato il ramo dal tronco facendo un registro svn

svn log --stop-on-copy

Dal momento che ci sono più rami di sviluppo che sono vivi allo stesso tempo, anche questo non funzionava per me, questo comando stava tirando anche cambiamenti da altri rami. Potrebbe essere questo un problema con il client SLik SVN?
Vanchinathan Chandrasekaran,

Sebbene ciò non sia inesatto, ci sono modi più semplici per unire le versioni più recenti di svn(come quello che sta utilizzando un OP).
blahdiblah,

@VanchinathanChandrasekaran, nel comando si specifica il nome del ramo in quanto svn://path/to/branch/branchNamedovrebbe estrarre solo le modifiche da quel ramo e non da altri rami. Se è così siamo in pericolo!
Fredrick Gauss,

1

La sintassi è sbagliata, dovrebbe invece esserlo

svn merge <what(the range)> <from(your dev branch)> <to(trunk/trunk local copy)>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.