SVN只合并一个登录目录(没有目录内容)

时间:2010-01-20 04:30:06

标签: svn merge directory

尝试合并(从分支机构)目录中尚不存在的文件。这是一个例子:

Trunk(我们从中分支)

/
/root1.txt
/foo/foo1.txt

分行(2次登记后)

/
/root1.txt
/foo/foo1.txt
/bar/bar1.txt
/bar/bar2.txt

首先登记:

A  /bar
A  /bar/bar1.txt

第二次登记:

A  /bar/bar2.txt

假设主干没有改变,是否可以 /bar/bar2.txt进入主干?以下是我已经尝试过的解决方案:

svn merge -rX:X+1 /path/to/branch/bar .  --> nothing gets merged here
svn merge -rX+1:X+2 /path/to/branch/bar .  --> pulls bar2.txt into the trunk but not within bar directory
svn merge -rX:X+1 /path/to/branch .      --> pulls both directory and bar1.txt into trunk

svn copy /path/to/branch/bar .           --> recursively copies directory bar into trunk

mkdir /path/to/trunk/bar
svn add bar
svn merge -rX+1:X+2 /path/to/branch/bar bar/

这里的最终解决方案有点有效。它允许我只将bar2.txt拉入主干并继续,但是当我尝试将我的分支重新集成回主干后,你就会在目录上出现树冲突(目录在两个地方都被添加 - >'local add,收货时加入合并')。

我理解,如果我的团队会做更精细的谷物检查 - 即在一次提交中添加目录而在另一次提交中添加文件 - 那么我可以合并,因为我正在尝试上面。这是唯一的解决方案吗?

  1. 似乎SVN允许您将分支中的单个文件合并到主干中,因此可以使用单个目录(非递归)吗?
  2. 在上面找到的部分解决方案中,我是否可以将分支中的目录标记为与主干合并,而与同时签入的其他文件无关,这样我就不会发生树冲突?
  3. 谢谢!

2 个答案:

答案 0 :(得分:2)

试试这个:

svn merge http://url/to/trunk/bar http://url/to/branch/bar bar/

如果您将所有合并命令视为简单应用差异,则会更容易。比较svn help mergesvn help diff的输出 - 它们非常相似。一旦你找到了svn diff命令,它将完全生成你需要的变更集,请将它应用到正确的目录中并进行设置!

所以在你的情况下,你需要的是bar / on trunk和bar / on branch之间的区别,应用于bar的本地(trunk)版本。

编辑:如果在主干中还没有bar /,则可以使用简单的svn复制操作:

svn copy http://url/to/branch/bar http://url/to/trunk/bar -m'merging new directory bar/'

(请注意,目标是svn存储库本身,而不是工作副本。)

答案 1 :(得分:0)

问题是您在A bar的同一修订版中提交了A bar/bar1.txt

我会在两次提交之前恢复。然后单独提交A bar,然后提交A bar/bar1.txt,然后提交A bar/bar2.txt。然后,您应该能够将所需的单个修订与主干合并。

更新:也许this document可以让您按照自己的意愿行事。虽然看起来对我来说有些迟钝。

  

Mergeinfo,或更具体地说是   版本化属性svn:mergeinfo,是   合并的历史变成了一个   给定的文件或目录。本文   详细介绍了mergeinfo;   这意味着什么以及如何运作。