在Subversion中用树枝替换树干

问题描述:

假设人们一直在树干上和Subversion版本库的一个分支上工作。我想放弃干线上的任何更改,并将其替换为分支的副本。在Subversion中用树枝替换树干

another question所示,我可以移动或移除树干,然后将分支复制到树干。但随后主干的历史被分支的历史取代。如果我想保留后备箱的历史记录怎么办?

我想我想要的就像是一个合并,但一个目标的变化被忽略,只是取代了源。我如何在Subversion中做到这一点?这被认为是良好的做法?

+0

您仍然可以通过浏览旧版本来访问中继历史... – 2009-02-25 20:05:29

+0

但是任何查看文件历史记录的工具(例如Subclipse)只会显示分支上的修订。合并/复制后,我希望在主干上看到一个新的修订版本,其中包含从复制操作中删除的所有添加/更改/删除。 – 2009-02-25 20:10:43

+0

+1:我也需要这样做。 @JW你有这个工作吗? – 2009-10-28 16:24:54

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

svn resolve path --accept theirs-full 

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

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

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

+3

不会保留从分支点开始对trunk进行的更改(至少在没有冲突时)?我很确定这种合并的结果不保证看起来像树干,但你是专家... – rmeador 2009-02-25 20:22:28

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

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

如果失败了,你可以反向合并自分支点以来的所有变化,然后在分支中合并。这似乎可能会导致一些冲突,您当然想要使用分支中的版本来解决这些冲突。我不知道这些想法是否是最佳的。

Pre-1.5这很简单:确保你的工作拷贝指向trunk,然后执行“svn合并url-of-trunk分支”。您收到的更改是主干和分支之间的增量,有效地“给我所需的所有东西,使树干看起来像分支。”

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

虽然它的一个很老的线程,但还是分享我的经验

最近,我们这样做是为了我们的项目之一,其次为准则:

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" 

按照这些步骤保持后备箱的历史完好无损并将新功能分支替换为中继。

trunk  remplace (trunk with your branch) 
*----x  * ----> 
\   | 
    \   | 
    *--------| 
    branch 

这个分支从主干创建,所以要小心不要粗暴地删除干线(问题与祖先)。首先做一个标记与你的躯干,您的备份,在任何情况下...

我建议这样做:

使用Eclipse SVN

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

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

  3. 分支:Team> disconnect。删除SVN信息。

  4. 团队>共享项目...选择你的树干。

  5. 团队>提交您的干线。

  6. 点击右键...选择与...分支/标签 - >寻找您的分支。如果一切正常,您将拥有:“所选输入之间没有差异。”

我希望它有帮助。