2010-07-14 113 views
1

我有点不清楚在SVN合并分支,并想知道如果有人能解释...的svn:合并分支

project1 
    trunk 
     foo.c 
     bar.c 
     baz.c 
    branches 
    tags 
project2 
    trunk 
     foo.c 
     quux.c 
     boing.c 
    branches 
     project1-offshoot 
     foo.c 
     bar.c 
     baz.c 
     boing.c 
    tags 

假设我们有以下的情况。在我们的svn仓库中有一个“project1”。 Bob开始一个新项目“project2”并开始在主干下工作。然后查理说:“等一下!这就像project1!”所以他告诉Bob他将为project2创建一个名为“project1-offshoot”的分支(project1/trunk中的svn copy),并对其进行适当修改以准备与project2进行合并。

Bob和Charlie将project2/branches/project1-branchshoot合并到project2/trunk中的相应操作是什么?

文件“foo.c”和“boing.c”每个文件都有两个独立的历史记录(foo来自project1/trunk-> project2/branches/project1-offshoot以及来自project2/trunk;来自project2/trunk并从project2/branches/project1-branchshoot)。 SVN中的文件是否有两个祖先?或者你是否被迫选择一个作为祖先,然后从另一个文件中进行文本合并而不保留任何指向该文件源的链接?

回答

3

您可能需要将merge命令与--ignore-ancestry选项一起使用,因为源文件具有独立的历史记录且没有共享的祖先。

从版本控制使用Subversion(Subversion版本1.5),由本·柯林斯 - 苏斯曼,布莱恩·W·Fitpatrick和C.迈克尔Pilato:

“大部分合并涉及到比较树木 被祖先有关一个 另一个;因此,svn合并默认 此行为。有时, 但是,您可能需要合并 命令来比较两个不相关的 树。

“如果你问 SVN合并的两棵树比较, 你会看到整个第一棵树是 删除,随后 整个第二树的补充!在这种情况下 ,你会想SVN合并 做一个基于路径的比较而已, 忽略文件 和目录之间的任何关系。在 --ignore-ancestry选项添加到您的合并命令,它会表现就像 SVN差异。(相反, - 注意 - 血统选项将导致svn diff的行为像svn合并 命令。)“

如果我正确理解你的第二个问题(即, “SVN中的文件是否有两个祖先?”)答案是否定的。您必须将project1中的更改​​合并到项目2中,反之亦然。

只需注意:通常项目的分支文件夹是为特定项目树干的分支保留的,这意味着只有project1树干的分支进入project1的分支文件夹。当然,没有什么能够阻止任何人做出不同的事情,但它确实让事情变得更加美好和干净。