【问题标题】:How do I properly branch post-commit and revert the trunk in svn?如何正确分支提交后并在 svn 中恢复主干?
【发布时间】:2010-09-14 00:23:28
【问题描述】:

我有一些提交,我已经决定,事实上,将是更多的分支工作而不是主干工作。如何创建分支并恢复主干,同时仍确保以后合并不痛苦?

是不是像把当前主干复制到一个分支然后还原主干一样简单?还是以后会让人头疼?

【问题讨论】:

    标签: svn branch


    【解决方案1】:

    我认为 Philips 的方法类似于以下,假设最后一个“好”版本是 100,而您现在是 130,以创建新分支:

    svn copy -r100 svn://repos/trunk svn://repos/branches/newbranch
    svn merge -r 100:130 svn://repos/trunk svn://repos/branches/newbranch
    

    请注意,我们的想法是保留在这些修订中所做的更改,以便您可以将它们应用回主干。

    恢复主干:

    svn merge -r130:100 .
    svn ci -m 'reverting to r100 (undoing changes in r100-130)' . 
    

    (执行这些操作的顺序无关紧要,因此您可以在创建分支之前恢复主干。)

    然后你可以切换到你在 repo 中创建的新分支:

    svn switch svn://repos/branches/newbranch workdir
    

    【讨论】:

    • 这是一个很好的解决方案。我有一个类似的问题。这里唯一没有提到的是合并必须在工作副本上完成,所以你需要检查'newbranch'。
    • 当您重新整合这些更改时会怎样?在重新集成它们之前,您必须确保分支与主干是最新的,因此您必须合并主干 - > newbranch 这反过来也会合并到反向合并中(svn merge -r 100:130 svn://repos/trunk svn://repos/branches/newbranch)基本上删除您希望从 newbranch 进行的更改 (100:130)。
    • @RyanGriffith 想必您可以按照instructions here for blocking changes 将revert 记录为已合并到分支上
    【解决方案2】:

    说实话,我复制我的更改,恢复主干、分支,然后将我的更改提交到分支。主要原因是以后易于合并(如果您稍后在分支点从主干合并到分支,合并将包含您初始更改的还原)。

    这可能不是“正确”的方式,因为您在合并时总是可以跳过修订,但以后对我来说通常不会那么头疼。免责声明:我不是 svn 大师,所以对我来说可能更容易,因为我做错了 - 但我确实经常使用 svn。

    【讨论】:

    • 我认为合并会很痛苦。感谢您的回答
    【解决方案3】:

    遵循 Philip 的方法并没有错,只是它在修订历史中留下了一些“粗糙”。如果您想为了整洁而删除它们,并且修订版位于 HEAD,您可以按照 these instructions 将它们从存储库中删除。

    更新: Philip 的方法比问题中建议的方法更好,原因是他说的。 Mine 和 Philip 的方法类似,除了恢复主干我建议从修订历史中删除修订。 (正如我所说,只有当您要删除的所有修订都位于存储库的 HEAD 时,才能这样做。)

    【讨论】:

    • 您能否详细说明这是在做什么以及为什么?为什么我不能按照问题中建议的方法做?
    • 您在问题中发布的程序运行良好。唯一的缺点是它会在日志中留下额外的提交和还原。 Sam Hasler 的链接可以帮助清除这些额外的条目,但它是严格可选的。
    • 正如 Aaron 所说,您不必删除提交,它是严格可选的。如果您认为历史记录中的额外提交在任何时候都不会令人困惑,那么请不要打扰。只有当它们可能引起问题时,您才应该费心将它们删除。
    • 是的,弄乱数据库不是很舒服。如果需要一个完全干净的仓库,我可能会使用这种方法来提供帮助。
    【解决方案4】:

    我这里没有可用的 svn,但我会尝试这样做:

    确定您在历史上开始犯下坏事的时间点(比如修订版“100”,而您处于“130”时)

    svn copy trunk branch # create your branch while preserving history
    svn copy trunk@100 trunk #replace current revision with revision 100  
    

    这应该绕过不良历史记录而不添加反向合并(实际上您正在绕过 100 到 130 之间的主干历史记录,但是您在分支中保留了指向该历史记录的链接并在强制 rev 时访问主干仍然会产生正确的历史)

    然后

    svn switch branch workdir
    

    如果您想从主干中完全删除更改,这应该可以工作。如果你想保留一些小的,你可以从分支到主干再次挑选它们(如果你使用 svn 1.5,它将跟踪合并点并避免虚假冲突)

    【讨论】:

    • 它不允许我覆盖主干。无法说“路径'主干'已经存在”。你以前做过吗?难道我做错了什么?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2011-06-21
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2011-03-19
    相关资源
    最近更新 更多