2014-12-09 2 views
1

나는 우리 웹 사이트의 코드를 유지하기 위해 SVN을 사용하는 팀에서 일하고 있습니다. 이 팀은 2 년 동안 SVN을 사용해 왔지만 최근에 SVN 사례를 철저히 조사했으며 현재는 조금 다른 방식으로 운영됩니다.병합 기록을 삭제하면서 모든 기록을 보존하면서 생생하게 시작할 수 있습니까?

으로 배경 정보 :

  • trunk 자동 배치 생산하는 것입니다, 이것은 항상을 의미 깨끗합니다. 작은 대부분의 버그 수정, 사소한 조작은, (1 페이지) 기능은 우리는 그들이 모두 XXX-DEV 곳 XXX라는 것, 더 광범위한 기능 개발에 사용되는 여러 다른 지점을 가지고
  • xxx-dev

  • 에 근무하는
  • dev가된다 지형지 물의 이름입니다.

  • 매일 동기화 병합은 trunk -> 다른 모든 분기에서 실행됩니다. 이것은 약간 지루하지만 우리 지점을 동기화하여 trunk에있는 것을 유지하면서 동시에 동기화 할 때 해결해야하는 충돌을 최소화합니다. 변경 사항은 다른 사람들이 매일 트렁크에 배포하므로 모든 지점을 최신 상태로 유지해야합니다. 난 거북이를 사용하고 수정되지 않은 모든 수정본이 trunk의 분기로 병합되도록 개정 범위 상자를 공백으로 남겨 둡니다.

최근, 뭔가 (작년 나쁜 일이 모든 종류의 등 개정을 건너, 우리의 병합의 역사로 인해 잘못 수행하는 병합 일어나고 있었다) 이전 지점에서 배포 잘못 갔다. 정확히 무슨 일이 있었는지 알 수는 없지만 더 이상 트렁크에서 지점으로 병합을 동기화 할 수 없습니다. 이미 병합 된 일부 이전 버전을 다시 병합하려고 시도하고이를 수행하지 못하고이를 통해 밀어 넣으려고하면 모든 종류의 오류가 발생합니다. 이 사건 이전에는 이러한 이전 버전에 대한 여러 가지 문제가 병합 프로세스에서 무산되었으며 지점을 삭제하고 트렁크에서 다시 작성했습니다. 그러나 이것은 병합 기록을 보존 할 수 있으며 이러한 문제에서 벗어나기 위해 병합 기록을 모두 잃을 필요가 있다고 우려합니다.

위의 정보가 주어지면 모든 병합 기록을 모두 삭제하고 코드 trunk의 새로운 코드 사본을 사용하여 해당 신선한 trunk을 복사하여 모든 지점을 다시 만들고 우리가 진행하는대로 진행하는 것이 가장 좋습니다. 하지만 우리가 매일 동기화를하기 시작하기 전의 나쁜 병합 기록은 없습니다.

내 질문 : 내가 설명한대로, 우리는 단지 trunk 디렉토리의 svn : mergeinfo 속성을 재귀 적으로 삭제해야합니까? 그게 문제가 되겠습니까? 나는 trunk이 저장소의 루트 디렉토리 아래에 있다고 생각하기 때문에 우리는 몇 가지 이유로 우리가 필요했던 이전 병합 기록을 볼 수있을 것입니다.

내가 잘못했거나 SVN 정책에 잘못된 것이있는 경우 알려주세요.

감사합니다.


편집 : 내가보고있어 충돌이 svn:mergeinfo 건물 자체 ...에 될 일이 있음을 언급한다 그래서 나도 몰라 svn:mergeinfo을 수정했다 나쁜 병합 거기에 어떻게 또는 왜 누구에 팀은 실수로이 디렉토리의 svn:mergeinfo 속성을 삭제했지만 이번에는 모든 문제를 일으키는 것으로 보이는 변경 사항은 삭제 된 svn:mergeinfo 속성입니다.

이 삭제 된 svn:mergeinfo은 하위 디렉토리에 있지만 분기의 루트 디렉토리에는 없습니다.

답변

2

전체 트렁크 디렉토리에서 svn : mergeinfo 속성을 재귀 적으로 삭제해야합니까?

네, 그렇게 할 수 있습니다. 당신은 모든 mergeinfo (물론)를 잃어 버릴 것이지만, 다음 번에 누군가가 "fancy"(모든 종류의 이슈에 대한 입구 문이 될 수있는 subtree merge를하는 것처럼) 때까지 원활하게 진행되어야합니다.

그게 문제입니까?

글쎄, 모든 브랜치를 다시 만들 수있는 정상적인 방법을 찾으면 (기본적으로 깨끗한 트렁크에서 새 브랜치를 만들고 원래 브랜치의 모든 변경 사항을 직접 교체하여 해당 브랜치에 병합해야합니다).

  1. 가 손으로 svn:mergeinfo 속성을 수정 :

    그러나, 나는 당신이뿐만 아니라 고려해야 적어도 두 가지 옵션이 있다고 생각합니다. 트렁크에서 브랜치로 (잘못) 병합 된 하나의 오래된 병합 일 경우 트렁크/브랜치의 mergeinfo 속성을 손으로 수정하지 마십시오 (또는 --record-only 플래그를 사용하여 Subversion이 당신)?

  2. (1)이 옵션이 아닌 경우 정말로 모든 분기가 영향을 받는지 확인해야합니다. 그렇지 않다면, 당신은 단지 그들을 재현 할 필요가 있습니다. 잠재적으로 모든 것을 대체하는 것보다 많은 작업을 절약 할 수 있습니다.

희망이 있습니다. 미래에 대한 조언 : 그룹의 하위 트리 병합을 명시 적으로 금지하고 검토를 수행하십시오 (예 : 분기를 병합하기 전에 적어도 한 명의 다른 개발자가 분기의 변경 사항을 검토하도록하십시오). 더 나은 방법은 모두 git을 사용하는 것입니다.하지만이 방법이 모든 사람에게 최선의 선택 (또는 실행 가능)이 아님은 알고 있습니다.

은 문제의 편집에 대응 편집 : 당신은 하위 트리 mergeinfo에 문제가있는 경우, 그 해결책은 훨씬 더 쉽게입니다 : 모든 지점 트렁크의 사본 (그리고 하위 트리 지점) 것을 주어, 트렁크를 포함하여 저장소의 모든 하위 트리에 대해 모든 svn:mergeinfo 속성을 삭제하면됩니다.

우리는 똑같은 작업을 한 번 수행해야했습니다. 기본적으로 전체 저장소를 체크하고 트렁크 및 분기 루트를 제외한 모든 폴더에 대해 svn:mergeinfo 속성의 삭제를 수동으로 (또는 스크립팅하여) 다시 커밋했습니다. 나중에 더 이상 문제가 없습니다.

+0

MergeInfo를 수정하고 싶습니다. 그러나 무엇이 잘못 되었는 지 100 % 확신하지 못합니다. 나는 내가 만든 변경이 나중에 이상한 병합 문제를 일으키지 않을 것이라고 확신하지 못한다. MergeInfo를 잘못 쓰면 나중에 병합 파일이 병합되거나 변경되지 않습니다. – BumbleShrimp

+0

내 질문을 몇 가지 관련 정보로 업데이트했습니다. 내가하려고하는 병합은 mergeinfo를 삭제하는 리비전을 하위 디렉토리에 병합하려고 시도하는 것입니다. 수정본에 거북이가 이미 병합 된 것으로 표시되어 이상한 점이 있으므로 다시 병합하려고하는 이유를 알 수 없습니다. 또한 우리는 미래에 Mercurial로 전환하여 이러한 병합 문제를 피하는 방법을 모색하고 있습니다. 그러나 지금은 SVN을 사용하고 있습니다. – BumbleShrimp

+0

Hey Michael, 나는 mergeinfo를 재귀 적으로 삭제 한 다음, 백업 된 값을 사용하여 각 브랜치의 최상위 레벨에 다시 추가했습니다.이로 인해 우리의 동기화 병합이 다시 가능 해졌고 올바른 조치였던 것처럼 보였습니다. 그러나 이제는 하위 트리에 병합 된 수정 사항이 더 이상 병합되지 않은 것으로 표시됩니다. 그게 가능한지 아십니까? 또는 하위 트리에 병합하면 최상위 디렉토리에 'mergeinfo'가 추가됩니까? – BumbleShrimp

관련 문제