2013-04-11 100 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