SVN 合并和树冲突 "local add, incoming add upon merge"

SVN Merging and tree conflicts "local add, incoming add upon merge"

我正在尝试遵循 http://svnbook.red-bean.com/en/1.7/svn.branchmerge.commonpatterns.html 中描述的发布分支模型,但是在尝试进行合并时我遇到了合并冲突。

# Normal SVN Structure
svn-testing2> ls -l
total 12K
drwxrwxr-x 3 xxx yyy 4.0K Jan 13 17:28 branches/
drwxrwxr-x 3 xxx yyy 4.0K Jan 13 17:28 tags/
drwxrwxr-x 3 xxx yyy 4.0K Jan 13 17:28 trunk/

# Create & commit some  data
svn-testing2> echo "line1" > trunk/file1; svn add trunk/file1; svn commit -m "created file1 " trunk/file1
Adding         trunk/file1
Transmitting file data .
Committed revision 2.

# Create the release branch
svn-testing2> svn copy trunk branches/release
A         branches/release
svn-testing2> svn commit -m "created release branch" branches/release
Adding         branches/release
Adding         branches/release/file1

Committed revision 3.

# Make & commit a change to trunk
svn-testing2> echo "line1-file2" > trunk/file2; svn add trunk/file2; svn commit -m "created file2" trunk/file2
A         trunk/file2
Adding         trunk/file2
Transmitting file data .
Committed revision 4.

# Attempt to merge the change to trunk:
svn-testing2> cd branches/release/
svn-testing2/branches/release> svn merge ^/trunk
--- Merging r2 through r4 into '.':
   C file1
A    file2
Summary of conflicts:
  Tree conflicts: 1
bumjvr@mbs-p:~/svn-testing/svn-testing2/branches/release> svn st
 M      .
      C file1
      >   local add, incoming add upon merge
A  +    file2

我可以用

解决这个问题
svn-testing2> svn resolve --accept=working *

但我必须这样做似乎是错误的。

如果我随后将 "hotfix"(例如创建 "release/file3")应用到我的发布分支,我如何将其移植回 t运行k?如果我将 "release" 合并到 "trunk" 中,它可以正常合并,但是当将 "trunk" 合并回 "release" 时,我会遇到另一个 local add, incoming add upon merge 冲突,例如"file3"

我不是要 "reintegrate" 功能分支,因为它们都是长 运行ning 分支。

令人沮丧的是,SVN 红皮书(通常是优秀的)描述了这种常见的分支模式,但没有实际使用什么命令的示例 运行!

我究竟需要什么才能运行 遵循这种分支模式而不会出现所有这些不正确的合并冲突?或者在任何地方是否有这种分支模式的任何有效示例 - 我找不到任何!

这是因为您的 copy 操作完全在客户端完成。此操作不包含任何合并跟踪信息,因此当您尝试合并时,它会尝试在自身之上添加 file1copy 命令的帮助中的免责声明中描述了此行为:

> svn help copy

copy (cp): Copy files and directories in a working copy or repository.
usage: copy SRC[@REV]... DST

  SRC and DST can each be either a working copy (WC) path or URL:
    WC  -> WC:   copy and schedule for addition (with history)
    WC  -> URL:  immediately commit a copy of WC to URL
    URL -> WC:   check out URL into WC, schedule for addition
    URL -> URL:  complete server-side copy;  used to branch and tag
  All the SRCs must be of the same type. When copying multiple sources,
  they will be added as children of DST, which must be a directory.

  WARNING: For compatibility with previous versions of Subversion,
  copies performed using two working copy paths (WC -> WC) will not
  contact the repository.  As such, they may not, by default, be able
  to propagate merge tracking information from the source of the copy
  to the destination.

如果将 copy 更改为服务器端副本,合并将成功:

# This is the difference, the copy happens on the server
> svn copy ^/trunk ^/branches/release2 -m "Creating release2"
Committed revision 5.

# Update our working copy to get the new release
> svn update branches
Updating 'branches':
A    branches\release2
A    branches\release2\file1
A    branches\release2\file2
Updated to revision 5.

> echo blah>trunk\file3; svn add trunk\file3; svn commit -m "created file3"
A         trunk\file3
Adding         trunk\file3
Transmitting file data .
Committed revision 6.

> cd branches\release2
> svn merge ^/trunk
--- Merging r5 through r6 into '.':
A    file3
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .