Subversion에서 트리 충돌이 발생하는 이유는 무엇입니까?


353

트렁크의 기능 분기가 있었고 트렁크에서 분기로 변경 사항을 주기적으로 병합하고 모든 것이 제대로 작동했습니다. 오늘 저는 지점을 트렁크로 다시 병합했으며 지점을 만든 후 트렁크에 추가 된 파일은 "트리 충돌"로 표시되었습니다. 앞으로 이것을 피할 수있는 방법이 있습니까?

나는 이것이 제대로 표시되지 않았다고 생각합니다.


빈 저장소에서 시작하여이 문제를 재현 할 수있는 레시피를 제공 할 수 있습니까?
Wim Coenen

나는 오늘 새로운 레포를 만들고 이것을 테스트하고 동일한 결과를 얻고 다시 게시 할 시간을 찾고 있습니다. 감사.
그렉

답변:


399

게리가 준 링크를 읽는 해결책을 찾았습니다 (이 방법을 따르도록 제안합니다).

SVN 클라이언트 1.6.x로 작업 디렉토리커밋 하는 트리 충돌을 해결하기 위해 요약하면 다음을 사용할 수 있습니다.

svn resolve --accept working -R .

.디렉토리가 충돌하는 위치 는 어디 입니까?

경고 : "작업 디렉토리 커밋"은 샌드 박스 구조가 커밋중인 구조임을 의미합니다. 예를 들어 샌드 박스에서 일부 파일을 삭제 한 경우 리포지토리에서도 삭제됩니다. 이것은 충돌 된 디렉토리에만 적용됩니다.

이런 식으로 SVN은 충돌을 해결하기 위해 SVN을 제안하고 ( --resolve) 현재 디렉토리 ( ) 에서 시작 하여 샌드 박스 ( --accept working) 내부의 작업 복사본을 재귀 적으로 ( -R) 수락합니다 ..

TortoiseSVN에서 오른쪽 클릭으로 "해결됨"을 선택하면 실제로이 문제가 해결됩니다.


32
이런 식으로 충돌을 해결하기 위해 svn을 제안하고 (-해결), 샌드 박스 내부의 작업 사본을 수락하고 (-작업을 수락 함) 재귀 적으로 (-R) 현재 디렉토리를 시작합니다 (.). HTH
gicappa

22
TortoiseSvn에서 오른쪽 클릭으로 "해결됨"을 선택하면 실제로이 문제가 해결됩니다.
understack

40
맹목적으로 작업 사본을 수락하지 않습니까? 나는 이러한 갈등과 관련된 문제가 어디에 있는지 알 수 없다고 생각하지만, 그냥 해결하고 일을 받아들이면 다른 사람들의 일을 지울 수 있습니까?
Parris

10
이런 일이 발생하는 원인 중 하나 svn rm'd는 더 이상 필요하지 않다고 생각되는 디렉토리이지만 다른 누군가가 필요한 새 파일을 추가했기 때문일 수 있습니다 . 작업 복사본을 업데이트하면 트리 충돌이 발생합니다. 맹목적으로 해결책을 받아들이면 (디렉토리 삭제) 그 사람의 파일이 제거됩니다. 마술 "올바른 일"버튼은 없습니다. 현재 수행중인 작업, 최신 버전과 충돌 한 이유 및 올바르게 해결하는 방법을 이해해야합니다.
bambams

5
@TWiStErRob, 나는이 증상이 버전 제어 도구로서 SVN 고유의 문제를 나타내는 것이라고 주장한다. 개인적으로 앞으로이 문제를 '피하는'방법은을 사용하는 것 git입니다. 그것은 아마도 asker에게 실용적인 옵션이 아니기 때문에이 답변이 설명하는 상황을 다루는 것이 가장 좋은 옵션입니다.
Jess Telford

59

Subversion 1.6은 디렉토리 수준에서의 충돌을 다루기 위해 트리 충돌을 추가했습니다. 좋은 예는 파일을 로컬로 삭제 한 다음 업데이트가 해당 파일에서 텍스트 변경을 시도하는 경우입니다. 또 하나는 편집중인 파일의 Subversion Rename이 추가 / 삭제 작업이므로 편집하는 파일입니다.

CollabNet의 Subversion 블로그에는 Tree Conflicts 에 대한 훌륭한 기사가 있습니다.


9
당신이 제공하는이 예들 중 어느 것도 나의 상황과 관련이 없습니다. 아마도 내 설명이 명확하지 않습니까?
그렉

33

내 경험상 SVN은 폴더를 삭제할 때마다 트리 충돌을 일으 킵니다. 이유가없는 것 같습니다.

내 코드에서 작업하는 유일한 사람-> 디렉토리 삭제-> 커밋-> 충돌!

Git 으로 전환하기를 기다릴 수 없습니다 .

나는 명확히해야한다-나는 Subclipse를 사용한다 . 아마도 문제 일 것입니다! 다시, 나는 전환을 기다릴 수 없다 ...


2
SVN 명령 줄 클라이언트와 동일한 문제이므로 Eclipse가 아닙니다.
고인돌

3
NetBeans 및 SVN과 동일한 문제가 있습니다. 디렉토리 삭제-> 충돌
Gruber

2
같은 문제가 여기에 ... ... ... 삭제하고 커밋 REVERT, 업데이트에 아주 아주 성가신이
marcolopes

1
트리 충돌이 발생했을 때 IntelliJ Idea와 함께 큰 트릭을 발견했습니다. 모든 변경 사항을 저장합니다 (변경 사항 패치를 만든 다음 롤백하는 것과 같습니다). 그런 다음 Subversion에서 최신 변경 사항을 얻기 위해 svn 업데이트를 수행합니다. 그 후 변경 사항 (패치 적용과 동일)과 비올라를 보관 해제합니다!
ehrhardt

1
Assembla repos에 대한 Ubuntu 12.04.4 LTS에서 svn client 1.7.9를 사용하는 것과 동일한 문제가있는 것 같습니다.
siliconrockstar

28

이것이 당신에게 일어나고 있는지 모르겠지만 때로는 병합 할 잘못된 디렉토리를 선택하고 모든 파일이 완전히 잘 보이 더라도이 오류가 발생합니다.

예:

/ svn / Project / branches / some-branch / Sources를 / svn / Project / trunk로 병합 ---> 트리 충돌

/ svn / Project / branches / some-branch를 / svn / Project / trunk로 병합 ---> 확인

이것은 어리석은 실수 일지 모르지만, 좀 더 복잡하다고 생각하기 때문에 항상 분명하지는 않습니다.


17

여기서 일어나는 일은 다음과 같습니다. 트렁크에 새 파일을 만든 다음 지점으로 병합합니다. 병합 커밋에서이 파일은 브랜치에서도 생성됩니다.

브랜치를 다시 트렁크로 병합하면 SVN은 다시 동일한 작업을 시도합니다. 브랜치에서 파일이 생성 된 것을 확인하고 병합 커밋에서 트렁크에 파일을 생성하려고 시도하지만 이미 존재합니다! 트리 충돌이 발생합니다.

이를 피하는 방법은 특수 병합, 재 통합 을 수행하는 것 입니다. --reintegrate스위치로 이를 달성 할 수 있습니다 .

http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate 문서에서 이에 대해 읽을 수 있습니다 .

그러나 가지를 트렁크에 다시 병합 할 때 기본 수학은 상당히 다릅니다. 기능 분기는 이제 복제 된 트렁크 변경 사항과 개인 분기 변경 사항의 혼잡이므로 복사 할 간단한 연속적인 수정 범위가 없습니다. --reintegrate 옵션을 지정하면 Subversion에게 분기에 고유 한 변경 사항 만 신중하게 복제하도록 요청합니다. (실제로 최신 트렁크 트리와 최신 분기 트리를 비교하여이를 수행합니다. 결과 차이는 정확히 분기 변경 사항입니다!)

분기를 다시 통합 한 후에는 분기를 제거하는 것이 좋습니다. 그렇지 않으면 트렁크에서 분기까지 다른 방향으로 병합 할 때마다 트리 충돌이 계속 발생합니다. (앞에서 설명한 것과 정확히 같은 이유로)

이 문제를 해결할 방법이 있지만 시도한 적이 없습니다. 이 게시물에서 읽을 수 있습니다 : v1.6의 Subversion 브랜치 재 통합


1
--reintegrateSubversion 1.8에서는 옵션이 더 이상 사용되지 않아 다운 보트 되었습니다. SVN 1.8부터 이러한 병합은 자동으로 이루어집니다!
bahrep

8
많은 사람들이 여전히 subversion <1.8
juacala를

SVN 버전 정보를 정답에 추가하는 것이 좋습니다.
피터 Mortensen

1
1.8 여기 에이 솔루션이 없으면 작동하지 않습니다.
Winter

왜 이런 일이 발생했는지에 대한 질문에 대답하기 때문에 공감되었습니다.
Joshua Breeden

7

이것은 동일한 버전의 클라이언트를 사용하지 않아서 발생할 수 있습니다.

동일한 저장소에 버전 1.5 클라이언트와 버전 1.6 클라이언트를 사용하면 이러한 종류의 문제점이 발생할 수 있습니다. (나는 방금 물렸다.)


4

파일 근처에서 편집 / 삭제 / come하지 않았기 때문에 의미가없는 트리 충돌이 발생하면 merge 명령에 오류가있을 가능성이 높습니다.

일어날 수있는 일은 이전에 현재 병합에 포함 된 많은 변경 사항을 이미 병합 한 것입니다. 예를 들어 트렁크에서 누군가 파일을 편집 한 후 나중에 이름을 바꿉니다. 첫 번째 병합에서 편집을 포함시킨 다음 두 번째 병합에서 편집과 이름 바꾸기 (실제로 제거)를 모두 포함하면 트리 충돌이 발생합니다. 그 이유는 이전에 병합 된 편집이 사용자 자신의 편집으로 나타나기 때문에 제거가 자동으로 수행되지 않기 때문입니다.

적어도 1.4 리포지토리에서 발생할 수 있습니다 .1.5에 도입 된 병합 추적이 여기에 도움이되는지 확실하지 않습니다.


2

오늘까지, 적어도 3 개월 전부터 지점을 트렁크에 다시 병합하려고 할 때 ( TortoiseSVN 1.11 사용 ) 수백 번의 트리 충돌이 발생했습니다 . BTW를 기반으로했는지 여부 2004 년 v1 이후로 TortoiseSVN을 사용해 왔으며, 항상 브랜치를 다시 통합하는 데 사용했습니다. 최근에 무슨 일이 있었을 것 같아요?

그래서 오늘 저는이 간단한 실험을했는데이 미친 갈등을 일으키는 것이 무엇인지 알게되었습니다.

  1. 나는 트렁크 @ 393을 포크했다;
  2. 수십 개의 파일을 임의로 수정하고 새 파일을 만들었습니다.
  3. 나는 커밋했다. 이제 @ 395 (동료가 394에서 자신의 작업을 수행하도록 분기했습니다).
  4. 그런 다음 지점을 트렁크에 다시 통합하려고 시도했지만 테스트 만했습니다. 마법사에서 TortoiseSVN의 권장 사항에 따라 : "모든 개정을 병합하려면 (재 통합) 상자를 비워 두십시오". 이를 위해 트렁크 폴더를 마우스 오른쪽 버튼으로 클릭하고 "/ path / to / branch에서 TortoiseSVN> 병합"을 선택 하고 대화 상자에 표시된대로 rev 범위를 비워 두었습니다 .

토론 : (첨부 파일 참조)

무엇의 모든 개정 ...? 약간은 내가 아는 한 클라이언트가 참조 된해야 " 대상의 모든 버전! (트렁크)", 등, 해당 분기를 재 통합의 과정에서, 나는 "병합 개정 1-HEAD"를 언급을 보았다! 세상에 불쌍한 악마, 당신은 여기서 당신의 죽음에 빠지고 있습니다. 그 지점은 339 년에 태어났습니다. 하나님을 위해서 출생 증명서를 읽을 수 없습니까?SVN-cli는 개정판 1에서 어리석은 행동을 취하고 있습니다.

해결:

  1. 위즈가 조언 한 것에 반하여, 분기의 모든 개정판을 포함하는 범위를 지정하십시오! 따라서, 394-HEAD ;
  2. 이제 병합 테스트를 다시 실행하고 시가를 얻습니다. ( 두 번째 첨부 파일 참조).

도덕 : 나는 그들이 왜 버그를 고치지 않았는지 알 수 없습니다. 그것이 버그이기 때문에 죄송합니다. 시간을내어 그들과 함께보고해야합니다.


1

내 특정 문제는 아마도 귀하의 문제와 관련이 없지만 오늘도이 문제를 겪었습니다. 파일 목록을 검사 한 후, 내가 한 일을 깨달았습니다. 한 어셈블리에서 다른 어셈블리의 파일을 일시적으로 사용하고있었습니다. 나는 그것에 많은 변경을하고 SVN 기록을 고아하고 싶지 않기 때문에 내 지점에서 다른 어셈블리의 폴더에서 파일을 옮겼습니다. 이것은 SVN에 의해 ​​추적되지 않으므로 파일이 삭제 된 다음 다시 추가되는 것처럼 보입니다. 결국 트리 충돌이 발생합니다.

파일을 다시 이동하고 커밋 한 다음 분기 병합 하여 문제를 해결했습니다 . 그런 다음 나중에 파일을 다시 옮겼습니다. :) 그것은 트릭을하는 것처럼 보였다.


1

나는 비슷한 문제가 있었다. 실제로 나를 위해 일한 유일한 것은 다음과 함께 충돌하는 하위 디렉토리를 삭제하는 것입니다.

svn delete --force ./SUB_DIR_NAME

그런 다음 작업 사본의 다른 루트 디렉토리에서 다시 복사하십시오.

svn copy ROOT_DIR_NAME/SUB_DIR_NAME

그런 다음

svn cleanup

svn add *

마지막 경고가 표시 될 수 있지만 무시하고 마지막으로 경고하십시오.

svn ci .

0

나는이 같은 문제가 있었고이 지침을 사용하여 병합을 다시 실행하여 해결했습니다 . 기본적으로 SVN의 "2-URL 병합"을 사용 trunk하여 히스토리 및 트리 충돌에 대해 크게 신경 쓰지 않고 지점의 현재 상태 로 업데이트 합니다. 114 트리 충돌을 수동으로 수정하지 않아도됩니다.

그것이 역사를 보존하고 싶은지 확실하지 않지만, 제 경우에는 가치가 있습니다.


5
역사는 우리가 VCS를 사용하는 이유입니다.
TWiStErRob

0

때때로 발생하는 시나리오 :

릴리스 브랜치를 생성 한 트렁크가 있다고 가정합니다. 트렁크에서 일부 변경 (특히 "some-dir"디렉토리 작성)을 수행 한 후 나중에 릴리스 분기로 병합 할 기능 / 수정 브랜치를 작성합니다 (변경 사항이 충분히 작고 릴리스에 기능 / 수정이 중요하기 때문에). .

trunk -- ... -- create "some-dir" -- ...
     \                                  \-feature/fix branch
      \- release branch

그런 다음 기능 / 수정 지점을 릴리스 지점으로 직접 병합하려고하면 디렉토리가 기능 / 수정 지점에 없어도 트리 충돌이 발생합니다.

svn status
!     C some-dir
      >   local missing or deleted or moved away, incoming file edit upon merge

따라서 기능 / 수정 지점을 병합하기 전에 "some-dir"디렉토리를 작성한 기능 / 수정 지점을 작성하기 전에 트렁크에서 수행 된 커밋을 명시 적으로 병합해야합니다.

git에서는 필요하지 않으므로 종종 잊어 버립니다.

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