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것입니다 (그러면 동일한 요소에서 작업하게됩니다).
병합 만에서 발생하기 때문에 병합 다시 할 수없는 경우 B1에 B2, 다음 수동 병합 각각에 대해 필요합니다 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.