Svn Subversion-如何将一些变更集从主干移动到分支?

Svn Subversion-如何将一些变更集从主干移动到分支?,svn,Svn,我们有一个大项目,有几个子项目。我们即将发布我们的项目,一个子项目中的新特性不会像最初计划的那样在发布之前完成。我想做的是将与新特性相关的子项目的所有更改移动到一个单独的分支中,以继续为下一版本工作,但我不确定如何最好地完成这一点 情况基本上是: /proj/trunk/A/ /proj/trunk/B/ /proj/trunk/C/ /项目/主干/A/ /项目/主干/B/ /项目/主干/C/ 自上次发布以来,我们已经签入了修订版a..z。修订版d、f、g和j..n包含与C中的一个新特性相关的工

我们有一个大项目,有几个子项目。我们即将发布我们的项目,一个子项目中的新特性不会像最初计划的那样在发布之前完成。我想做的是将与新特性相关的子项目的所有更改移动到一个单独的分支中,以继续为下一版本工作,但我不确定如何最好地完成这一点

情况基本上是:

/proj/trunk/A/ /proj/trunk/B/ /proj/trunk/C/ /项目/主干/A/ /项目/主干/B/ /项目/主干/C/
自上次发布以来,我们已经签入了修订版a..z。修订版d、f、g和j..n包含与C中的一个新特性相关的工作,该特性不会及时完成。修订版e、h和q包含C中不相关的更改,这些更改需要在本版本中进行。我想创建一个
/proj/branchs/new-feature-for-C/
并将更改d、f、g和j..n移到那里,同时将e、h和q保留在主干中。要移动到分支的更改与要保留在主干上的更改之间没有重叠,并且要移动到分支的更改都不依赖于自上次发布以来任何其他子项目中的任何更改。

这并不能回答您的问题,但在将来,您应该首先在不同的分支上开发每个子项目。只有当一个子项目完成并准备好装运时,才应将其合并到主干中。这样,行李箱始终处于可装运状态

唯一的挑战是两个不同的子项目是否需要共享一些相同的新代码。Subversion使该案例具有挑战性,但Git、Mercurial和Bazaar等其他版本控制系统使该案例变得简单

就回答您的实际问题而言,以下URL解释了如何撤消特定修订号:


我想你可以把整个树干都支起来。然后,分支机构将拥有所有子项目(包括您正在发布的项目和尚未准备好的项目)。而且,对于每个要撤消的修订,您可以将上面链接中的技术一遍遍地应用到主干上。听起来会很乏味和混乱,但它应该会起作用。

建立回购协议的方法有很多,但我通常的做法是这样的

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
当我在最新的代码(主干)中发现一个bug时,如果需要,我会将它合并回当前版本的分支(例如分支/R1)


您不想创建太多分支,因为这会导致从主干合并时需要更多的工作,所以请尽量减少分支的数量。

我会这样做:将主干复制到分支,然后反向合并更改集

因此,如果主干位于
http://svnserver/svn/myrepo/trunk/C
不需要的更改集是
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"
svn拷贝http://svnserver/svn/myrepo/trunk/C http://svnserver/svn/myrepo/branch/C -m“分支机构无可完成工作”
svn合并-c-3,-6http://svnserver/svn/myrepo/trunk/C 
svn合并-r 11:8http://svnserver/svn/myrepo/trunk/C 
****检查每件事是否正常***
svn提交-m“删除了一些未完成的更改”

请注意,
-r 11:8
比您想要停止的变更集少了一个

我用这种方式做了一些尝试,但我看不到一种简单的方法,在新功能完成后将其全部合并回主干中。因为我们从主干的头部进行分支,然后恢复主干上不需要的更改,所以似乎没有好的方法将这些更改与更新的更改一起从分支中拉回来以完成功能C,同时保留对与功能C无关的主干的更改。您使用的subversion版本是什么?在1.5+中,它应该可以工作,尽管您可能希望使用--reintegrate选项。在1.5之前,我已经成功地使用了svnmerge.py脚本。存储库尚未升级,因此我没有1.5+合并跟踪功能。我遇到的问题(可能是我做错了什么)是,当我尝试重新整合功能分支时,没有什么可以区分从主干中删除不完整的功能,以及之后在主干上发生的其他有意义的更改。因此,所有已复制的现有工作都会被删除、保留删除,或者我会丢失删除不完整功能后所做的其他更改。您是否尝试过(1)重新合并未合并的更改,然后(2)将分支合并回主干中。(1) 应该让您回到原始+常规更改(2)应该重新添加分支,并且由于主干现在已经恢复了已删除的更改,它应该(希望)正常工作。让我知道它是否有效。为了澄清,我在对我们的主回购做任何事情之前,一直在测试回购上玩这个,所以我可以尝试不同的方法,并有更小的更改集。你的建议似乎管用,但感觉很笨拙。我最初认为这需要手动检查所有更改的列表两次,一次将其从主干中取出,第二次将其全部放回主干中。然后我意识到,要把它放回去,我需要做的就是反转一次提交,在复制分支后,它被全部取出。我仍然觉得有点笨拙,但应该是可行的。