2009-05-19 9 views
10

Abbiamo un grande progetto con diversi sotto-progetti. Ci stiamo avvicinando a una versione del nostro progetto e le nuove funzionalità in un sottoprogetto non saranno completate prima del rilascio come originariamente previsto. Quello che mi piacerebbe fare è spostare tutte le modifiche a quel sottoprogetto relative alle nuove funzionalità in un ramo separato per continuare a lavorare per la prossima versione, ma non sono sicuro di come farlo al meglio.Subversion - come spostare alcuni changeset dal trunk a un ramo?

La situazione è fondamentalmente:

/proj/trunk/A/ 
/proj/trunk/B/ 
/proj/trunk/C/

Abbiamo revisioni a..z controllati nel dall'ultima release. Le revisioni d, f, g e j..n contengono lavori relativi a una nuova funzionalità in C che non verrà completata in tempo. Le revisioni e, h e q contengono modifiche non correlate in C che devono essere presenti in questa versione. Mi piacerebbe creare un /proj/branches/new-feature-for-C/ e spostare le modifiche d, f, g e j..n lì, mantenendo e, h, e q nel bagagliaio. Non vi è alcuna sovrapposizione tra le modifiche da spostare nel ramo e le modifiche da mantenere sul trunk e nessuna delle modifiche da spostare nel ramo dipende da eventuali modifiche in qualsiasi altro sottoprogetto dall'ultima versione.

risposta

10

Ecco come lo farei: copia il trunk su un ramo, quindi inverti i gruppi di modifiche.

quindi se il tronco è a http://svnserver/svn/myrepo/trunk/C e gli insiemi di modifiche indesiderate sono 3, 6 , 9-11

svn copy http://svnserver/svn/myrepo/trunk/C http://svnserver/svn/myrepo/branch/C -m "Branch no completable work" 
svn merge -c -3,-6 http://svnserver/svn/myrepo/trunk/C <filepath to root of trunk> 
svn merge -r 11:8 http://svnserver/svn/myrepo/trunk/C <filepath to root of trunk> 
****CHECK EVERY THING WORKED*** 
svn commit . -m "Removed some changes that weren't to be finished" 

Si noti che il -r 11:8 è uno in meno del changeset si vuole fermare a

+0

ho giocato un po ' con questo modo, ma non riesco a vedere un modo semplice per unire tutto nel bagagliaio una volta che la nuova funzionalità è stata completata.Poiché ci siamo diramati dalla testa del tronco, poi abbiamo ripristinato le modifiche indesiderate sul tronco, non sembra esserci un buon modo per rimettere quelle modifiche dal ramo insieme alle modifiche più recenti per completare la caratteristica C, preservando le modifiche al tronco non correlato alla caratteristica C. – Thomee

+0

quale versione di subversion stai usando? In 1.5+ dovrebbe funzionare, anche se potresti voler usare l'opzione --reintegrate. Prima della 1.5 ho usato lo script svnmerge.py con un certo successo. –

+0

Il repository non è stato aggiornato, quindi non dispongo delle funzionalità di tracciamento unione 1.5+. Il problema che sto incontrando (e forse è qualcosa che sto sbagliando), è che quando sto cercando di reintegrare il ramo della funzione, non c'è nulla da distinguere tra la rimozione della feature incompleta dal trunk e altri significativi cambiamenti che sono accaduti sul tronco dopo quello. Quindi tutto il lavoro esistente che è stato copiato viene rimosso, rimane rimosso o io perdo le altre modifiche apportate dopo aver rimosso la funzionalità incompleta. – Thomee

2

Questo non risponde alla tua domanda, ma in futuro dovresti sviluppare ciascuno dei tuoi sottoprogetti su un ramo diverso per cominciare. Solo quando un sottoprogetto è finito e pronto per la spedizione dovrebbe essere fuso nel bagagliaio. In questo modo, il bagagliaio è sempre in uno stato di spedizione.

L'unica sfida è se due diversi sottoprogetti devono condividere parte dello stesso nuovo codice. Subversion rende questo caso impegnativo, ma altri sistemi di controllo delle revisioni come Git, Mercurial e Bazaar rendono facile quel caso.

Per quanto riguarda rispondere alla tua domanda attuale, il seguente URL spiega come annullare un numero di revisione specifica:

http://svnbook.red-bean.com/en/1.5/svn-book.html#svn.branchmerge.basicmerging.undo

Credo che si potrebbe diramare l'intero tronco. Quindi, il ramo avrebbe tutti i sottoprogetti (sia quelli che stai spedendo sia quelli che non sono ancora pronti). E, puoi applicare la tecnica dal link sopra e sopra al trunk per ciascuna delle revisioni che vuoi annullare. Sembra che sia noioso e disordinato, ma dovrebbe funzionare.

0

Esistono molti modi per configurare i repository, ma il modo in cui di solito lo faccio è questo.

trunk - always tracks the latest code in development that will definitely get released 
branches/R1 - when I do a release, I create a branch for it, and also a tag (see below R1.0). This branch always tracks the latest version of Release 1.x. If I need to go back, I use the tags, below. 
branches/Import Tool - when I am working on a standalone feature that may not get released with latest code (e.g., main product is a calendar, import tool may not be ready in time). 
tags/R1.0 
tags/R1.1 - every time I release an update to a release, I create a tag, so that I can easily revert to that version e.g., if I need to reproduce a bug 
tags/R1.2 

Quando trovo un bug nel codice più recente (tronco), mi fondo di nuovo nel ramo di release corrente (ad esempio, i rami/R1) se necessario.

Non si desidera creare troppe ramificazioni, in quanto causerà più lavoro nell'unione dal trunk principale, quindi mantenere il numero di rami il più piccolo possibile.

Problemi correlati