我对在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中的文件可以有两个祖先吗?或者您是否被迫选择一个作为祖先,然后从另一个文件进行文本合并而不保留任何指向该文件源的链接?
答案 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文件夹中。当然没有什么可以阻止任何人做出不同的事情,但它确实让事情变得干净整洁