SVN预览更新显示冲突,但更新不会导致冲突

时间:2012-10-18 21:30:32

标签: svn version-control merge

我们在repo中看到一个奇怪的问题,其中以下命令报告传入的冲突:

svn merge --dry-run -r BASE:HEAD . | egrep -e '^[[:space:]]*(A|B|C|D|E|G|U)+[[:space:]]+'

   C path/to/fileA
   C path/to/fileB
   C path/to/fileC
U    path/to/fileD

但是,svn up实际上不会导致冲突。实际上,输出看起来像这样:

At revision 7922.
At revision 7922.
At revision 7922.
U    path/to/fileD
Updated to revision 7922.

据我所知,有问题的文件并不奇怪。 svn状态不报告任何问题,svn信息显示文件是最新的,并且svn resolve无效。这种情况会定期发生,但不是每次都发生,并且始终显示相同的文件。

有没有人见过这个?

编辑:看起来我遗漏了一个关键细节,这也许就是为什么没有人能够在这里回答。在svn up步骤中,我们将单独更新每个文件以避免在分级自动部署期间发生冲突(例如t0:预测传入更新,t1:针对数据库运行任何必要的架构更改,t1 + X:更新其余部分批处理,其中X可能是一个非平凡的数字)。完整更新如下所示:

svn up --depth=empty path/to/fileA path/to/fileB path/to/fileC path/to/fileD

At revision 7922.
At revision 7922.
At revision 7922.
U    path/to/fileD
Updated to revision 7922.

1 个答案:

答案 0 :(得分:0)

看起来这里的问题来自不同步的父目录。

例如:

修订版X:

A  path/to/fileA

修订版X + 1:

A  path/to/fileB
A  path/to/fileC

我们一直在更新:(让我们假设BASE = X-1且HEAD = X + 1)

%> cd dir/
%> svn merge --dry-run -r BASE:HEAD .     # look ahead for incoming updates
%> ...                                    # run schema updates against DB
%> svn up --depth=empty path/to/fileA     # update just the incoming changes to
   path/to/fileB path/to/fileC            # avoid pulling someone else's
                                          # recent commit

虽然这对于提交中涉及的3个文件都很好,但是dir /,dir / path /和dir / path / to /现在是HEAD修订版的后面。 svn info dir /将修订报告为X-1(BASE),因为它没有包含在之前的svn中。

现在我们进入修订版X + 2:

U  path/to/fileD

我们再次尝试这个过程,但这次前瞻报告发生冲突:

%> cd dir/
%> svn merge --dry-run -r BASE:HEAD .
...
   C path/to/fileA
   C path/to/fileB
   C path/to/fileC
U    path/to/fileD
...

(来自X-1-> X + 2的传入,实际上文件已经存在)。与此同时,对这些文件的svn将无害地报告所有内容都是最新的。

我们已经将我们的部署转变为更原子的过程,因此我们可以自由地从分支根目录中获取所有内容,避免丑陋的--depth = empty,并保持所有文件同步。

相关问题