2013-04-11 1 views
1

Subversion 분기의 코드를 병합하는 동안 이해가 안되는 것을보고 있습니다.Subversion 병합 실패

우리는 일부 기능에 대한 수정 프로그램을 구현 한 'experimental'브랜치가 있습니다. 일반 개발 트렁크에 평소와 같이 진행하면서 우리는 지난 2 주 동안 실험 분기에 해킹 진행

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

: 우리는 함께 가지 작업을 시작. 지점에서의 작업은 특정 "루트"폴더에서만 발생합니다 (usermngmt-II).

이제 분기 작업을 트렁크에 다시 병합 할 시간입니다. 병합 중에 나타나는 문제는 "실험 분기에서 결코 변경되지 않은 파일은 트렁크에서 완전히 통합되지 않습니다"라고 설명 할 수 있습니다.

$ 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 

그래서 전복은 '작업보고 : 폴더의 트렁크의 버전을 미러링하는 작업 폴더에서 시작

...

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

$ svn status 
$ 

는 ... 우리는 병합 명령을 실행 '버전 - 우리 작업 폴더의 버전 (위에서 본 것처럼 "트렁크"를 미러링 함)은 라인이있는 것으로보고됩니다 ...

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의 고양이"를 사용 :

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

"conflicted"파일은 "experimental"브랜치의 형태로 "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. 중요 할 경우 Subversion 1.6을 사용하고 있습니다. 서버에서 버전 1.6.11을 더 spefically 사용하고 클라이언트 컴퓨터에서 명령 줄 인터페이스 1.6.17 버전을 사용합니다. 문제가되는 동작은 최신 TortoiseSVN을 사용할 때도 나타납니다 (그래서이 버전이 특정 버전인지 의심 스럽습니다).

+0

재 통합하기 전에 트렁크 변경 사항을 지점에 병합 했습니까? – maxim1000

+0

@ maxim1000 : 트렁크의 버전 "usermgmnt-II"를 experimental 브랜치 (--reintegrate없이)에 병합하려고하면 정확하게 동일한 충돌이 발생합니다 : https://gist.github.com/anonymous/5362364 – ttsiodras

+0

Merge'trunk' 'experimental'으로,'trunk' 버전의 충돌 파일을 가져 와서'experimental'을 다시 트렁크에 병합 하시겠습니까? –

답변

0

나열된 명령에서 볼 수 있듯이 "experimental"이 트렁크에서 분기되었지만 "experimental/usermgmnt-II"를 다시 통합하려고합니다. 이것은 문제의 원인 일 수 있습니다.

+0

이 말이 맞다고 생각하지 않습니다. - 합병은 관련 하위 트리에 대해 완료된 커밋을 고려해야하기 때문에 원래 차이를 복사 한 것과 어떤 차이가 있습니까? 소스 트리? 특정 폴더의 해당 버전 (즉, 지점 및 트렁크)을 병합하고 있기 때문에 실패 원인을 밝히지 않은 이유는 이론적으로 영향을받지 않아야합니다. 다른 VCS에는 영향을주지 않습니다. – ttsiodras

+0

내 생각 엔 "experimental/usermgmnt-II"가 "trunk/usermgmnt-II"대신 "trunk"에 병합되도록 시도되었습니다. – maxim1000