SVN 파일이 두 분기에 추가 될 때 새 트리 충돌을 해결하는 방법


95

두 가지 분기에 파일이 추가 된 (SVN 1.6.1 사용) 몇 가지 분기를 병합 할 때 (그리고 별도의 분기에서 작업) 새 트리 충돌 중 하나가 발생합니다.

      C foo.txt
  >   local obstruction, incoming add upon merge

두 가지의 변경 사항이 필요하지만 트리 충돌로 인해 일반적인 .working, .merge-left 및 .merge-right 파일이 제공되지 않습니다. 충돌의 특성으로 인해 이해할 수 있습니다. 이러한 충돌 중 상당수와 각 분기에서 동일한 파일이 삭제 된 충돌이 있지만 해결하기가 쉽습니다.

이 문제를 어떻게 해결할 수 있습니까? SVN redbean 책 (1.6 용)은이 상황을 다루지 않습니다.

답변:


40

"트리 충돌"디자인 문서 의 이전 버전 (2009)에서 언급 한 바와 같이 :

버전이 지정된 파일에 추가 병합으로 인한 XFAIL 충돌

이 테스트는 기존 버전 파일에 기록없이 파일 추가가져 오는 병합을 수행 합니다 .
이것은 ' local obstruction, incoming add upon merge'품종 의 파일에 대한 트리 충돌이어야합니다 . r35341의 예상치를 수정했습니다.

(ClearCase에서는 "evil twins"라고도합니다.) :
파일이 두 개의 다른 분기에서 두 번 생성 (여기서는 두 번 "추가됨")되어 두 개의 다른 요소에 대해 두 개의 다른 기록을 생성하지만 이름은 같습니다.

이론적 인 해결책은 대상 브랜치 ' B2' 에서 이러한 파일을 외부 diff 도구를 사용하여 수동으로 병합하는 것 입니다.

여전히 소스 브랜치에서 작업하는 경우 이상적인 시나리오는 소스 브랜치에서 해당 파일을 제거하고 B1에서 B2로 다시 병합 B1하여 해당 파일을 볼 수 있도록하는 B1것입니다 (그러면 동일한 요소에서 작업하게됩니다).
병합 만에서 발생하기 때문에 병합 다시 할 수없는 경우 B1B2, 다음 수동 병합 각각에 대해 필요합니다 B1->B2병합.


2
은 "트리 충돌"디자인 문서는 :( 링크가 부패입니다
whitey04

4
재미있는 점은 추가 된 두 파일이 동일 하더라도 여전히 충돌하는 것으로 표시 된다는 것입니다 . 이것은 실제로 충돌로 표시되어서는 안됩니다.
SantiBailors

1
@SantiBailors 너무 재밌어 지금 죽어 가고 있어요. 내 오랜 친구 자식을 위해 죽어 ...
Winter

163

이에 대한 해결책을 제안 하는 게시물을 찾았 습니다 . 곧 실행됩니다.

svn resolve --accept working <YourPath>

로컬 버전 파일을 OK로 주장합니다.
단일 파일 또는 전체 프로젝트 카탈로그에 대해 실행할 수 있습니다.


2
감사합니다.이 문제도 해결됩니다. C foo.txt> 로컬 추가, 업데이트시 수신 추가
lazysoundsystem 2010

5
감사합니다 그것은 저에게도 효과가 있었지만 이것을해야했습니다 : svn resolve --accept working FILENAME
ajacian81

5
예, 파일 이름이 필요합니다. '.'를받습니다. (현재 디렉토리). 나는 또한 이것을 재귀 적으로해야했다 : "svn resolve --accept working --recursive." 작업 카피에 찬성 결의의 모든 (!이 작업을 수행 할 때 충돌을 해결하는 경우 위험 당신은 항상 멀리 다른 사람의 변화를 불어 될 수 있습니다)
해리 나무

트리 충돌 파일을 모두 나열하기 위해 만든 별칭을 사용합니다. alias mtc='stat | awk "BEGIN { FS=\" \" } /^.{6}C/ { print \$NF }"' 그런 다음 다음과 같이 resolve 명령에 대한 인수로 사용할 수 있습니다. svn resolve --accept working $(mtc)
Earl Jenkins

1
: 사실 당신은 또한 자원의 예에서 지정할 필요 svn resolve --accept working path/index.html
토마스 Kuter

9

들어오는 변경 사항이 원하는 변경 사항이면 어떻게됩니까? svn resolve --accept theirs-full을 실행할 수 없습니다.

svn resolve --accept base


4
나는 질문을 오해했다고 생각합니다. 'base'는 실제로 'svn resolve'를 사용할 때 'theirs-full'과 동일하지만 문제를 해결하지 못합니다. 대신 내가 한 일은 두 부분으로 나누는 것입니다. 1) 로컬 충돌 디렉토리 (또는 파일) 삭제, 2) 병합. 이 충돌없이 실행해야하고, '들어오는 변화는 당신이 원하는 것들'이후, 나는 삭제 된 항목에 대해 걱정하지 것이다
가브리엘 FT 고메스

3

위의 user619330의 조언을 따르기 위해 꽤 철저히 노력했습니다. 상황은 다음과 같습니다. (1) : 초기 브랜치 인 branch1에서 작업하는 동안 일부 파일을 추가했습니다. (2) 추가 개발을 위해 새로운 브랜치 인 branch2를 생성하고, 트렁크에서 분기 한 다음 브랜치 1의 변경 사항을 병합합니다. (3) 동료가 브랜치 1에서 자신의 브랜치로 내 모드를 복사하고 추가 모드를 추가했습니다. 그런 다음 다시 트렁크로 병합되었습니다. (4) 이제 트렁크의 최신 변경 사항을 현재 작업 브랜치 인 branch2로 병합하고 싶었습니다. 이것은 svn 1.6.17입니다.

병합은 새 파일과 트리 충돌을 일으켰고, 다른 트렁크에서 새 버전을 원했기 때문에 branch2의 깨끗한 복사본에서 충돌하는 파일을 svn 삭제하고 이러한 branch2 변경 사항을 커밋했습니다 (따라서 임시 문제의 파일이없는 branch2 버전), 트렁크에서 병합했습니다. 나중에 트렁크로 다시 병합하려고 할 때 더 많은 문제가 발생하지 않도록 히스토리가 트렁크 버전과 일치하기를 원했기 때문에 이렇게했습니다. 병합이 잘되었고, 파일의 트렁크 버전을 얻었고, svn st는 모두 확인을 보여주고, 이전에 수행 한 삭제와 병합에서 추가 사이에 변경 사항을 커밋하는 동안 더 많은 트리 충돌을 발생 시켰습니다. svn이 내 작업 복사본 (이제 파일의 트렁크 버전이 있음)을 위해 충돌을 해결하고 커밋했습니다.

음 ... 아니. branch2의 다른 복사본을 업데이트하면 이전 버전의 파일이 생성되었습니다 (트렁크 이전 병합). 이제 두 개의 서로 다른 작업 복사본을 가지고 있는데, 같은 버전으로 업데이트 된 것으로 추정되며 두 가지 다른 버전의 파일이 있으며 둘 다 완전히 최신 상태라고 주장합니다! branch2의 깨끗한 사본을 체크 아웃하면 이전 (트렁크 이전) 버전의 파일이 생성되었습니다. 수동으로 트렁크 버전으로 업데이트하고 변경 사항을 커밋하고 첫 번째 작업 복사본 (원래 트렁크 변경 사항을 제출했던)으로 돌아가서 업데이트를 시도한 다음 문제가되는 파일에 체크섬 오류가 발생합니다. 문제의 디렉토리를 날려 버리고 업데이트를 통해 새 버전을 얻으십시오. 마지막으로 트렁크 변경으로 좋은 버전의 branch2가되어야합니다. 나는 희망. 주의 사항 개발자.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.