Domanda

Qui abbiamo un repository SVN con un trunk e un ramo per lo sviluppo su una nuova versione.

Il ramo è quasi pronto per il rilascio, quindi ho deciso di reintegrare il ramo nel tronco. Ovviamente ci sono stati alcuni conflitti. Compresi molti conflitti di alberi da file che erano stati eliminati nel trunk.

Ho risolto tutti i conflitti abbastanza felicemente e ho impegnato il tronco.

Il problema è che abbiamo quindi apportato alcune modifiche minori al ramo, quindi sono andato a reintegrare nuovamente il ramo e si sono verificati tutti gli stessi conflitti dell'albero. Risolverli non è un problema, ma ce ne sono molti e ci vuole un po 'di tempo per controllarli e risolverli tutti manualmente e non voglio passare attraverso gli stessi processi di risoluzione ogni volta che apporto una modifica e reintegro. Mi aspettavo che SVN riconoscesse che il ramo era già stato reintegrato una volta e si era unito solo dal punto in cui era avvenuta l'ultima reintegrazione.

Quando apro il grafico di revisione, mostra il tronco e il punto in cui il ramo è stato diviso, ma non mostra l'unione. Dovrebbe?

Server: WinServer2003 (R2sp2), VisualSVNServer (1.7.2). Client: WindowsXP (sp3), sto usando TortoiseSVN (1.6.5) per fare tutto questo, ma ho anche installato il client della riga di comando.

Faccio l'unione assicurandomi di avere il trunk aggiornato e usando TortoiseSVN per fare un'unione, e seleziono " Reintegrare un ramo " quando viene presentato con la finestra di dialogo delle opzioni. Ho impostato la profondità di unione su " Copia di lavoro "

Sto gestendo questo scenario in modo errato? Dovrei fare qualcosa di diverso?

(p approccio errato, ho letto che alcune persone lo fanno al contrario, apportano tutte le modifiche al trunk e eseguono il ramo solo quando si è quasi pronti per il rilascio e il ramo diventa la versione di rilascio supportata)

È stato utile?

Soluzione

Quanto segue è dalla fine di questo capitolo del libro SVN:

  

In Subversion 1.5, una volta eseguita un'unione - reintegrate da un ramo all'altro, il ramo non è più utilizzabile per ulteriori lavori. Non è in grado di assorbire correttamente le nuove modifiche del trunk, né può essere nuovamente reintegrato correttamente nel trunk. Per questo motivo, se vuoi continuare a lavorare sul ramo delle funzionalità, ti consigliamo di distruggerlo e quindi ricrearlo dal trunk

Altri suggerimenti

In questa situazione non unirei il codice dal ramo al trunk fino a quando non hai completato lo sviluppo.

I vorrei unire da trunk a branch per assicurarmi che il branch sia aggiornato con eventuali correzioni applicate al trunk. Esegui periodicamente questa attività per assicurarti che il tuo ramo di sviluppo contenga tutte le correzioni. Quindi, nel momento in cui lo sviluppo diventa la versione live, esegui l'unione da ramo a tronco come attività una tantum.

La mia risposta fa alcune ipotesi tra cui:

  • Hai live trunk e dev rami
  • Hai solo un live versione (ovvero non mantenendo l'eredità le versioni)

Spero che sia d'aiuto.

Ora è effettivamente possibile eseguire ripetute fusioni bidirezionali

Un avvertimento. Questa risposta spiega come deve essere fatto, ma se perdi qualche passaggio ti dispiacerà. Ad esempio, l'unione --reintegrate deve essere del tutto banale (tutte le differenze sono già state risolte nel ramo) poiché altrimenti ti mancheranno silenziosamente le modifiche apportate nel passaggio --reintegrate merge quando continui a lavorare nel tuo ramo. L'alternativa è invece eliminare e ricreare il ramo ogni volta dopo - reintegrate.


In almeno svn versione 1.6 e successive è possibile eseguire ripetute fusioni bidirezionali. Puoi unire dal ramo 'principale' al ramo figlio tutte le volte che vuoi con solo svn merge, ma ogni volta che unisci il ramo con main, devi dare l'opzione

--reintegrate come menzionato nelle altre risposte.

Anche quello che devi fare è dire al tuo ramo che lo hai integrato in un secondo passaggio manuale (con quel ramo estratto e aggiornato) con il comando

svn merge --record-only -c 391 ^/calc/trunk

391 qui rappresenta il numero del commit di unione dal commit del ramo --reintegrate che hai appena fatto in calc / trunk.

Se lo manchi, potrebbe ancora funzionare o potresti dover risolvere nuovamente i conflitti di unione già risolti la prossima volta che li unisci. Dopo il solo passaggio dei record, le filiali sono pronte per ulteriore lavoro o fusione. È sciocco (specialmente se sei viziato da Git come me, dove le cose funzionano e basta), ma se lo fai secondo questo rituale funziona, ed entrambi i rami sono sempre aperti per nuovi commit.


Il tutto è documentato nel libro SVN in reintegrare due volte

  

Questa unione utilizza la sintassi di unione cherry-picking, che è stata introdotta   nella sezione chiamata & # 8220; Cherrypicking & # 8221 ;. Continuando con la corsa   esempio dalla sezione chiamata & # 8220; Reintegrazione di un ramo & # 8221 ;, dove   la revisione X era la revisione 391:

$ cd my-calc-branch $ svn update Updating '.': Updated to revision
393. $ svn merge --record-only -c 391 ^/calc/trunk
--- Recording mergeinfo for merge of r391 into '.':  U   . $ svn commit -m "Block revision 391 from being merged into my-calc-branch."
 Sending        .

 Committed revision 394.
  

Ora il tuo ramo è pronto per assorbire di nuovo le modifiche dal tronco. Dopo un'altra sincronizzazione del ramo con il tronco, è anche possibile reintegrare il ramo una seconda volta. Se necessario, è possibile eseguire un'altra unione solo record per mantenere in vita il ramo. Risciacqua e ripeti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top