2009-05-19 7 views
10

Nous avons un grand projet avec plusieurs sous-projets. Nous approchons d'une version de notre projet, et les nouvelles fonctionnalités d'un sous-projet ne seront pas terminées avant la publication comme prévu initialement. Ce que je voudrais faire est de déplacer toutes les modifications de ce sous-projet liées aux nouvelles fonctionnalités dans une branche distincte pour continuer à travailler pour la prochaine version, mais je ne suis pas sûr de la meilleure façon d'y parvenir.Subversion - comment déplacer des changesets d'un tronc vers une branche?

La situation est fondamentalement:

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

Nous avons des révisions A..Z cochés depuis la dernière version. Les révisions d, f, g et j..n contiennent des travaux liés à une nouvelle fonction de C qui ne sera pas terminée à temps. Les révisions e, h et q contiennent des changements indépendants de C qui doivent figurer dans cette version. Je voudrais créer un /proj/branches/new-feature-for-C/ et déplacer les changements d, f, g et j..n là, tout en gardant e, h, et q dans le coffre. Il n'y a pas de chevauchement entre les modifications à déplacer vers la branche et les modifications à conserver sur le tronc, et aucun des changements à déplacer vers la branche ne dépend de changements dans aucun autre sous-projet depuis la dernière version.

Répondre

10

Voici comment je le ferais: Copiez le tronc dans une branche, puis inversez la fusion des ensembles de modifications.

donc si le tronc est à http://svnserver/svn/myrepo/trunk/C et les ensembles de modifications indésirables sont 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" 

Notez que le -r 11:8 est un de moins que la changeset vous voulez arrêter à

+0

J'ai joué un peu de le faire de cette façon, mais je ne peux pas voir un moyen facile de tout fusionner dans le coffre une fois la nouvelle fonctionnalité est terminée.Parce que nous avons dérivé de la tête du tronc, puis inversé les changements indésirables sur le tronc, il semble y avoir aucun bon moyen de retirer ces changements de la branche avec les changements plus récents pour terminer la fonctionnalité C, tout en préservant les changements à la tronc non lié à la fonctionnalité C. – Thomee

+0

quelle version de subversion utilisez-vous? Dans 1.5+ cela devrait fonctionner, mais vous pouvez utiliser l'option --reintegrate. Avant 1.5, j'ai utilisé le script svnmerge.py avec un certain succès. –

+0

Le référentiel n'a pas été mis à niveau, donc je n'ai pas les fonctionnalités de suivi de fusion 1.5+. Le problème que je rencontre (et c'est peut-être quelque chose que je fais mal), c'est que lorsque j'essaie de réintégrer la branche de fonctionnalité, il n'y a rien à faire entre la suppression de la fonctionnalité incomplète du tronc et d'autres changements qui sont arrivés sur le tronc après cela. Ainsi, tout le travail existant qui a été copié a ensuite été supprimé, reste supprimé ou je perds les autres modifications apportées après la suppression de la fonctionnalité incomplète. – Thomee

2

Cela ne répond pas à votre question, mais à l'avenir, vous devez d'abord développer chacun de vos sous-projets sur une branche différente. Ce n'est que lorsqu'un sous-projet est terminé et prêt à être expédié qu'il doit être fusionné en tronc. De cette façon, le coffre est toujours dans un état expédiable.

Le seul défi est de savoir si deux sous-projets différents doivent partager une partie du même nouveau code. Subversion rend ce cas difficile, mais d'autres systèmes de contrôle de révision tels que Git, Mercurial et Bazaar rendent ce cas facile.

En ce qui concerne répondre à votre question réelle, l'URL suivante explique comment annuler un numéro de révision spécifique:

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

Je suppose que vous pouvez ramifier votre tronc entier. Ensuite, la succursale aurait tous les sous-projets (ceux que vous expédiez et ceux qui ne sont pas encore prêts). De plus, vous pouvez appliquer la technique du lien ci-dessus au tronc pour chacune des révisions que vous souhaitez annuler. On dirait que ce sera ennuyeux et salissant, mais ça devrait marcher.

0

Il y a plusieurs façons de configurer les repos, mais comme je le fais habituellement, c'est ceci.

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 

Quand je trouve un bug dans le dernier code (tronc), je fusionner de nouveau dans la branche de la version actuelle (par exemple, les branches/R1) si nécessaire.

Vous ne voulez pas créer trop de branches, car cela entraînera un surcroît de travail lors de la fusion à partir du tronc principal, donc gardez le nombre de branches le plus petit possible.

Questions connexes