svn:合并分支

时间:2010-07-14 14:18:18

标签: svn merge

我对在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”并开始在主干下工作。然后查理说“等一下!这有点像项目1!”所以他告诉Bob他将为project2创建一个名为“project1-offshoot”的分支(来自project1 / trunk的svn copy)并对其进行适当修改以准备与project2合并。

鲍勃和查理采取什么措施将project2 / branches / project1-offshoot合并到project2 / trunk?

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

1 个答案:

答案 0 :(得分:3)

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

来自版本控制与Subversion(对于Subversion 1.5),Ben Collins-Sussman,Brian W. Fitpatrick和C. Michael Pilato:

  

“大多数合并涉及比较树木   与祖先有关的   另一个;因此,svn merge默认值   这种行为。偶尔,   但是,您可能想要合并   命令比较两个无关的   树“。

     

“如果你问   svn合并比较两棵树,   你会看到整个第一棵树   删除,然后添加   整个第二棵树!在这些   情况,你会想要svn合并到   仅进行基于路径的比较,   忽略文件之间的任何关系   和目录。添加    - 您的合并命令的--ignore-ancestry选项,它的行为就像   svn diff。 (反过来说,   --notice-ancestry选项将导致svn diff的行为类似于svn merge   命令)。“

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

注意:通常项目的branches文件夹是为特定项目的trunk的分支保留的,这意味着project1的trunk的分支只在project1的branches文件夹中。当然没有什么可以阻止任何人做出不同的事情,但它确实让事情变得干净整洁