代码之家  ›  专栏  ›  技术社区  ›  Thomee

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

svn
  •  10
  • Thomee  · 技术社区  · 16 年前

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

    基本情况是:

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

    自上次发布以来,我们已经签入了修订版a..z。修订版D、F、G和J.N包含了与C中的一个新特性相关的工作,这个新特性不能及时完成。修订版E、H和Q在C中包含了不相关的变更,这些变更需要在本版本中出现。我想创建一个 /proj/branches/new-feature-for-C/ 移动D、F、G和J.N的变化,同时保持E、H和Q在后备箱中。要移动到分支的更改和要保留在主干上的更改之间没有重叠,并且要移动到分支的任何更改都不依赖于自上次发布以来任何其他子项目中的任何更改。

    3 回复  |  直到 16 年前
        1
  •  10
  •   Andrew Cox    16 年前

    我就是这样做的:将主干复制到一个分支,然后反向合并变更集。

    所以如果行李箱在 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"
    

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

        2
  •  2
  •   Clint Miller    16 年前

    这并不能回答你的问题,但是将来你应该在不同的分支上开发你的每个子项目。只有当一个子项目完成并准备好交付时,它才能合并到主干中。这样,主干总是处于可装运状态。

    唯一的挑战是如果两个不同的子项目需要共享一些相同的新代码。Subversion使这个案例具有挑战性,但是其他的修订控制系统(如Git、Mercurial和Bazaar)使这个案例变得容易。

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

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

    我想你可以把你的整个后备箱都分开。然后,分支机构将拥有所有的子项目(包括您要装运的项目和尚未准备好的项目)。而且,对于您想要撤销的每个修订,您可以将上述链接中的技术一遍又一遍地应用到主干中。听起来会很乏味,很凌乱,但应该可以。

        3
  •  0
  •   D'Arcy Rittich    16 年前

    有很多方法可以设置回购,但我通常这样做。

    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时,如果需要的话,我将它合并回当前的发布分支(例如branches/r1)。

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