2013-04-11 98 views
1

我看到一些我不明白的东西,当从一个Subversion分支合并代码时。颠覆合并失败

我们有一个“实验”分支,我们在那里实施了一些功能的修复。我们开始与分支工作:

svn cp https://..../trunk https://.../branches/experimental 

我们继续破解的实验分行在过去的两个星期,而正常的发展继续像往常一样在树干上。在分支上工作只发生在特定的“根”文件夹(usermngmt-II)上。

现在是合并分支工作回干线的时候了。合并过程中出现的问题可以描述为:“在实验分支中从未改变过的文件,无法在干线中干净地合并”。

从镜像文件夹的树干版的工作文件夹开始......

$ cd workOnTrunk 
$ svn info 
Path: . 
URL: https://x.x.x.x/.../trunk/usermgmnt-II 
... 
$ svn update 
At revision 4900. 

$ svn status 
$ 

......我们执行合并命令:

$ svn merge --reintegrate ^/branches/experimental/usermgmnt-II/ 
Conflict discovered in 'webservices/usermngmt-ws-api/src/java/gr.neuropublic.gaia.usermngmt.ws.api/IUserMngmtService.java'. 
Select: (p) postpone, (df) diff-full, (e) edit, 
     (mc) mine-conflict, (tc) theirs-conflict, 
     (s) show all options: df 
--- /tmp/svn-9vbG0j  Πεμ Απρ 11 11:27:54 2013 
+++ webservices/usermngmt-ws-api/src/java/gr.neuropublic.gaia.usermngmt.ws.api/.svn/tmp/IUserMngmtService.java.8.tmp Πεμ Απρ 11 11:27:54 2013 
@@ -49,7 +49,16 @@ 

    public Pair<Integer, String> numOfUsers(); 

+<<<<<<< .working 
+ public Pair<List<Map<String, String>>, String> allSubsInfo(); 

+======= 
+>>>>>>> .merge-right.r4900 
+ public Pair<List<Map<String, String>>, String> allGaiaSubsInfo(); 
+ 
+ public Pair<List<Map<String, String>>, String> subsUsersInfo(int subs_id); 
+ 
+ 
    @Local 

所以颠覆报道说,“工作'版本 - 也就是说,我们工作文件夹中的版本(正如我们上面所看到的,镜像“主干”)据报道具有该行...

public Pair<List<Map<String, String>>, String> allSubsInfo(); 

...里面,而实验分支中的版本(如果我正确解译合并冲突消息)通过颠覆报告(a)没有“allSubsInfo”行,(b)但有两个人来代替:

public Pair<List<Map<String, String>>, String> allGaiaSubsInfo(); 
public Pair<List<Map<String, String>>, String> subsUsersInfo(int subs_id); 

然而,这种情况并非如此 - 来证明这一点,我们使用“SVN猫”打印实验分支中的文件的内容,和grep为报道的方法:

$ svn cat ^/branches/experimental/usermgmnt-II/webservices/usermngmt-ws-api/src/java/gr.neuropublic.gaia.usermngmt.ws.api/IUserMngmtService.java | grep 'all.*SubsInfo' 
$ 

很明显,在“实验”分支中的“冲突”文件没有“allSubsInfo”或“allGa”的实例iaSubsInfo”。实际上,通过“svn merge”命令生成的输出文件...

$ grep allSubsInfo IUserMngmtService.java.merge-right.r4900 
$ 

...也没有。事实上,如果我们只是普通的解压缩文件的两个版本:

$ svn cat -r4900 ^/branches/experimental/usermgmnt-II/webservices/usermngmt-ws-api/src/java/gr.neuropublic.gaia.usermngmt.ws.api/IUserMngmtService.java > /var/tmp/experimental.java 
$ svn cat ^/trunk/usermgmnt-II/webservices/usermngmt-ws-api/src/java/gr.neuropublic.gaia.usermngmt.ws.api/IUserMngmtService.java > /var/tmp/trunk.java 
$ diff -u /var/tmp/experimental.java /var/tmp/trunk.java 
--- /var/tmp/experimental.java 2013-04-11 11:49:13.000000000 +0300 
+++ /var/tmp/trunk.java 2013-04-11 11:49:58.000000000 +0300 
@@ -49,6 +49,13 @@ 

    public Pair<Integer, String> numOfUsers(); 

+ public Pair<List<Map<String, String>>, String> allSubsInfo(); 
+ 
+ public Pair<List<Map<String, String>>, String> allGaiaSubsInfo(); 
+ 
+ public Pair<List<Map<String, String>>, String> subsUsersInfo(int subs_id); 
+ 
+ 
    @Local 
    public interface ILocal extends IUserMngmtService {} 

......我们看到,在树干上的版本只是简单地添加3条线。因此,就这个文件在实验分支中的版本而言,“合并”过程应该是“无操作” - “实验分支中没有任何文件被提交,保持不变”。

在此先感谢您的任何帮助/建议。

P.S.如果它很重要,我们使用Subversion 1.6 - 更具体地说:服务器版本为1.6.11,在我的客户机上使用1.6.17版本的命令行界面。当使用最新的TortoiseSVN时也会出现问题行为(所以我倾向于怀疑这是特定版本)。

+0

在重新整合之前,您是否已将树干更改合并到您的分支? – maxim1000 2013-04-11 10:29:23

+0

@ maxim1000:尝试将trunk版本的“usermgmnt-II”合并到实验分支(没有--reintegrate),显示完全相同的冲突:https://gist.github.com/anonymous/5362364 – ttsiodras 2013-04-11 10:34:38

+0

合并'trunk'进入'实验性',拿着'trunk'版本的冲突文件,然后将'实验性'合并回主干? – 2013-04-12 11:35:19

回答

0

正如我从您列出的命令中看到的,“实验”是从树干分支出来的,但您尝试重新整合“experimental/usermgmnt-II”。这可能是问题的根源。

+0

我不认为这是正确的 - 合并应该考虑到对相关子树的提交,所以我最初复制整个源代码树?请注意,我正在合并特定文件夹的相应版本(即在分支和中继线中),因此您将归因于失败的原因应该(理论上)具有零影响。它绝对不会影响其他VCS。 – ttsiodras 2013-04-12 13:08:34

+0

我的猜测是“试验/ usermgmnt-II”试图合并到“trunk”而不是“trunk/usermgmnt-II”。 – maxim1000 2013-04-12 14:05:26