【问题标题】:Replacing trunk with branch in Subversion在 Subversion 中用分支替换主干
【发布时间】:2009-02-25 20:02:53
【问题描述】:

假设人们一直在处理主干和 Subversion 存储库的分支。我想丢弃主干上的任何更改,并将其替换为分支的副本。

按照another question 的建议,我可以移动或移除主干,然后将分支复制到主干。但是随后主干的历史被分支的历史所取代。如果我想保留主干的历史怎么办?

我认为我想要的是类似于合并的东西,但是目标的更改被忽略,而只是替换为源。我将如何在 Subversion 中执行此操作?这被认为是好的做法吗?

【问题讨论】:

  • 您仍然可以通过浏览旧版本来访问主干的历史...
  • 但是任何查看文件历史的工具(例如 Subclipse)只会显示分支上的修订。合并/复制后,我希望在主干上看到一个新修订版,其中包含复制操作中的所有添加/更改/删除。
  • +1:我也需要这样做。 @JW 你让这个工作了吗?
  • 还没有...我最终只是直接复制。

标签: svn


【解决方案1】:

虽然它是一个相当老的帖子,但仍然分享我的经验

我们最近为我们的一个项目做了这件事,并遵循以下准则:

svn copy <repos/trunk> <repos/tag/old_trunk> -m "copied old trunk as tag"

svn delete <repos/trunk> -m "deleted trunk temporarily"

svn copy <repos/branch/new_fetaure_branch> <repos/trunk> -m "placed new trunk with features"

按照这些步骤保持主干历史完整,并将新功能分支替换为主干。

【讨论】:

  • 如果您查看当前主干的历史记录,您将看到新分支的历史记录,直到您复制它为止。要查看旧主干的历史记录,您必须在删除之前指定修订。
  • 你可以在 /tag/old_trunk 中看到旧的主干历史
  • 我使用乌龟,但这将是我的策略。
【解决方案2】:

Pre-1.5 这很简单:确保你的工作副本指向主干,然后执行“svn merge url-of-trunk url-of-branch”。您收到的更改是主干和分支之间的增量,有效地“为我提供使主干看起来像分支所需的一切。”

我不知道 1.5 的新合并功能是否会改变这种情况。

【讨论】:

  • 将分支合并到主干可能不会产生与实际复制分支状态而不是主干相同的结果。甚至在 1.5 之前的版本中也没有
【解决方案3】:

合并从分支到主干的所有更改,然后解决所有冲突

svn resolve path --accept theirs-full

或者,您可以告诉合并这样做:

svn merge -rX:HEAD url/of/branch trunk\wc --accept theirs-full

在这样的合并之后,你有一个看起来像分支上的工作副本。您所要做的就是提交该主干的工作副本。

【讨论】:

  • 不会保留自分支点以来在主干上所做的更改(至少在没有冲突时)?我很确定这种合并的结果不能保证看起来像树干,但你是专家......
  • 您可以先在主干上进行反向合并以撤消创建分支以来的所有更改,然后提交该反向合并。之后就可以将分支合并到主干了。
  • 一个简单的 'svn rm trunk' 后跟 'svn copy branch trunk'(或 svn move branch trunk)怎么样?
  • @Stefan:您好先生,您能帮我解决我的问题here 吗?谢谢... :)
【解决方案4】:

我不太确定我是否理解您要执行的操作。您希望在创建分支后对主干上所做的所有更改发生什么?当您在合并后查看文件的历史记录时,您是否希望它们不出现在日志中?如果是这样,如果您删除主干并将分支复制到它的位置,您将得到这样的结果 - 分支在分支之前与主干共享历史记录,因此除了在分支之后进行的修订之外,它是相同的。

如果您想保留主干的历史记录,但只是踩踏在分支和合并之间所做的所有更改,这是一个稍微棘手的问题。我认为如果您进行忽略祖先的合并(有一个选项--ignore-ancestry),它将用分支替换主干的内容。您可能还想尝试--force 选项与合并(代替--ignore-ancestry 或与--ignore-ancestry 结合使用)。尝试几种不同的方法,看看是否能得到你想要的结果......

如果失败,您总是可以反向合并自分支点以来主干上的所有更改,然后合并到分支中。这似乎可能会导致一些冲突,您当然希望使用分支中的版本来解决这些冲突。我不知道这些想法是否是最佳的。

【讨论】:

  • 我想要你的两个选项中的第二个 - 踩住后备箱中的所有变化。
【解决方案5】:
trunk       remplace (trunk with your branch)
*----x      * ---->
 \          |
  \         |
   *--------|
     branch 

这个分支是从主干创建的,所以要小心不要粗暴地删除主干(祖先有问题)。首先用你的后备箱做一个标签,你的备份,无论如何......

我建议这样做:

使用 Eclipse SVN

  1. 点击右键>团队分支/标签(创建标签 - 你的备份)

  2. 团队>切换另一个分支/标签...选择你的分支,确保分支正确加载。

  3. 在分支:团队 > 断开连接。删除 SVN 信息。

  4. 团队>分享项目...选择你的主干。

  5. 团队 > 在您的后备箱中提交。

  6. 单击右键...选择比较... 分支/标记 -> 查找您的分支。如果一切正常,您将看到:“所选输入之间没有差异。”

希望对你有帮助。

【讨论】:

    【解决方案6】:

    我认为您要做的是合并两棵树。下面我引用来自tortoisesvn(https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-merge.html)的文档

    ".... 您要求 Subversion 做的是:" 计算获取 [From] 主干头修订版 [To] 主干头修订版分支所需的更改,并将它们应用到我的工作副本(后备箱)。 最终结果是主干现在看起来和树枝一模一样。"

    在你的情况下,主干是从,到是分支

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2012-03-25
      • 2011-11-13
      • 2023-04-01
      • 2010-10-16
      • 1970-01-01
      相关资源
      最近更新 更多