svn : 트렁크를 분기로 교체


156

Subversion 저장소의 분기 중 하나를 새 트렁크로 만드는 가장 좋은 방법은 무엇입니까?

전체 시스템에 대한 주요 재 작성이있었습니다. 사물이 이동, 재 작성, 교체, 제거, 이름이 변경되었습니다. 재 작성된 코드는 테스트를 거쳤으며 이전 트렁크를 대체 할 준비가되었습니다.

기본적으로 이전 메인 라인 (Trunk 5)에 태그가 지정되고 여기서 끝납니다. 재 작성된 브랜치 (Branch 6)는 새로운 메인 라인 (Trunk 7)이됩니다.

트렁크 (1)-> 트렁크 (2)-> 트렁크 (5)-> × +-> 새 트렁크 (7)
  \ \ |
  포크 병합 ???
    \ \ |
     +-> 분기 (3)-> 분기 (4)-> 분기 (6)-+

이전 'Trunk'에서 진행중인 모든 변경 사항은 이미 'Rewritten branch'에 통합되어 있습니다.

어떻게 할 수 있습니까?

답변:


118

svn move 를 사용 하여 이전 트렁크의 내용을 다른 곳으로 이동하고 나중에 브랜치의 이름을 trunk로 바꿉니다.

svn의 복사 및 이동은 파일 작업처럼 작동합니다. 이를 사용하여 저장소에서 항목을 이동 / 복사 할 수 있으며 이러한 변경 사항도 버전이 지정됩니다. "이동"을 "복사 + 삭제"로 생각하십시오.

[편집] Nilbus는을 (를) 사용할 때 병합 충돌이 발생할 것이라고 알려주었습니다 svn move.

나는 이것이 올바른 접근 방식이라고 생각합니다. 충돌이 발생하지만 신중하게 병합하면 데이터가 손실되지 않을 가능성이 있습니다. 그것이 당신을 괴롭 히면 Mercurial 또는 Git 과 같은 더 나은 VCS를 사용하십시오 .


1
이렇게하면 원래 트렁크의 작업 복사본에 변경 사항이있는 사람은 변경 사항이 병합 되더라도 충돌이 발생합니다. 파일이 삭제되고 다시 추가되기 때문입니다. 별도의 기록이있는 별도의 개체로 취급됩니다.
Edward Anderson

@nilbus : 해보 셨나요? IIRC, SVN은 파일이 삭제되고 읽 혔음을 보여 주지만 내부적으로는 파일이 이동되었음을 알 수 있습니다.
Aaron Digulla

예. 두 장을 확인했습니다. 첫 번째 사본에서 나는 dir A를 A2로, dir B를 A로 옮겼습니다. 그런 다음 A를 B로, A2를 A로 옮겼습니다. (이름을 바꾸고 이름을 다시 바꿉니다.) 두 번째 체크 아웃에서 파일을 변경하고 svn을 시도했습니다. 최신 정보. 내가 변경 한 파일이 "삭제"되었기 때문에 충돌했습니다. 내부적으로는 파일의 중복 사본을 저장하지 않지만 표시되는 삭제는 충돌과 관련하여 실제로 영향을 미칩니다.
Edward Anderson

12
@nilbus :이 시점에서 저는 Linus Torvalds를 인용하고 싶습니다. "한동안 Subversion의 슬로건은"CVS 제대로 완료 "또는 그와 비슷한 것입니다. 그런 종류의 슬로건으로 시작하면 할 수있는 곳이 없습니다. CVS를 제대로 수행 할 방법이 없습니다. "
Aaron Digulla

3
네. 동의합니다. 이 문제를 해결하기 위해 실제로 svn-git로 저장소를 확인하고 git을 사용하여 분기를 마스터로 리베이스했습니다.
Edward Anderson

67

이 목표를 달성하기 위해 svn move 명령을 사용하는 데 동의합니다.

나는 여기에있는 다른 사람들이 그것이 특이하다고 생각한다는 것을 알고 있지만, 나는 이것을 이렇게하는 것을 좋아합니다. 기능 분기가 있고 크게 수정 된 트렁크와 병합 할 준비가되면 일반적으로라는 이름의 새 분기에 병합합니다 <FeatureBranchName>-Merged. 그런 다음 충돌을 해결하고 병합 된 코드를 테스트합니다. 완료되면 트렁크를 태그 폴더로 이동하여 아무것도 잃지 않도록합니다. 마지막으로 <FeatureBranchName>-Merged트렁크 로 이동 합니다.

또한 이동을 할 때 작업 복사본을 피하는 것을 선호합니다. 다음은 명령 샘플입니다.

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

참고 : 1.5를 사용합니다.


2
이것이 최선의 방법은 아니지만 아주 오래된 트렁크가 있고 모두가 마치 트렁크 인 것처럼 브랜치에서 작업 할 때 가장 효율적입니다. 내 문제가 해결되었습니다!
Alex Perrin

12

최근에이 문제를보고 있었는데 매우 만족 스러웠던 해결책은

svn merge --ignore-ancestry trunk-url branch-url

내 트렁크의 작업 사본에.

이것은 변경 사항을 기록 방식으로 적용하려고하지 않습니다 (트렁크의 변경 사항 유지). 트렁크와 브랜치 사이에 단순히 "차이를 적용"합니다. 수정되지 않은 파일에서 사용자에게 충돌이 발생하지 않습니다. 그러나 분기에서 기록 정보를 잃게되지만 어쨌든 병합을 수행 할 때 발생합니다.


1
포스트 svn 1.5 당신은 역사를 보존하는 병합을 할 수 있어야합니다.
NSherwin

9

저장소 브라우저 도구를 통해 이러한 변경을 수행 할 것을 권장합니다.

작업 복사본을 통해 대규모 삭제 + 이동 작업을 시도하는 것은 작업 복사본을 종료하는 좋은 방법입니다. 작업 복사본을 사용해야하는 경우 각 삭제 또는 이동 작업 후 증분 커밋을 수행하고 각 커밋 후에 작업 복사본을 업데이트합니다.


리포에 대한 링크는 편리 할 것이다 (단지 구글 검색 : 저장 편의에 대한)
브라이언 M. 헌트

3
죄송합니다. 철자가 특정 도구를 언급하는 것처럼 보이게했습니다 (편집 됨). 실제로 대부분의 SVN GUI 도구에는 저장소 브라우저 기능이 있어야합니다. 참고 : 나는 거북이 사용 tortoisesvn.tigris.org
크리스 나바

4

브랜치를 새 트렁크로 만들려면 (예 : 브랜치가 생성 된 이후에 만들어진 트렁크의 모든 변경 사항을 제거하려면) 1. 트렁크의 브랜치를 생성합니다 (백업 목적으로) 2. "변경 사항 되돌리기 "트렁크에 (분기가 생성 된 후 모든 개정을 선택하십시오. 3. 분기를 다시 트렁크에 병합하십시오.

역사는 이렇게 남아 있어야합니다.

안부, Roger


3

@Aaron Digulla 및 @kementeus 솔루션은 실행 가능합니다. Subversion 1.4 리포지토리의 경우 복사 / 이동 작업으로 인해 향후 다른 리포지토리 구조로 마이그레이션하거나 리포지토리 분할이 어려울 수 있습니다.

1.5의 개선 사항에는 이동 / 복사 기록의 더 나은 해상도가 포함되어 있으므로 1.5 저장소에서는 문제가되지 않을 것입니다.

1.4 저장소를 들어, 내가 사용하는 것이 좋습니다 것 svnadmin dumpsvndumpfilter다음 같은 메커니즘을 트렁크에 지점을 이동, 다른 기존 트렁크의 움직임을 수행 할 수 있습니다. 두 개의 덤프 파일을 테스트 저장소에로드하고 확인한 다음 프로덕션으로 이동합니다.

물론 시작하기 전에 기존 저장소를 백업하십시오.

이는 이동 / 복사를 명시 적으로 기록하지 않고 기록을 보존하고 향후 재구성, 기록 보존을 더 쉽게 만듭니다.


편집 : 요청한대로 1.4 Red-Bean 책, Filtering Repository History 에서 1.4 동작에 대한 문서

또한 복사 된 경로로 인해 문제가 발생할 수 있습니다. Subversion은 이미 존재하는 경로를 복사하여 새 경로를 만드는 저장소에서 복사 작업을 지원합니다. 리포지토리 수명의 어느 시점에서 svndumpfilter제외 되는 일부 위치에서 포함 된 위치로 파일 또는 디렉터리를 복사했을 수 있습니다 . 덤프 데이터가 자급 자족하도록하려면svndumpfilter복사본에 의해 생성 된 모든 파일의 내용을 포함하여 새 경로의 추가를 계속 표시해야하며 필터링 된 덤프 데이터 스트림에 존재하지 않을 소스의 복사본으로 해당 추가를 나타내지 않아야합니다. 그러나 Subversion 저장소 덤프 형식은 각 개정에서 변경된 내용 만 표시하기 때문에 복사 소스의 내용을 쉽게 사용할 수 없습니다. 저장소에 이러한 종류의 복사본이 있다고 의심되는 경우 문제가되는 복사 작업의 소스로 사용 된 경로를 포함하여 포함 / 제외 된 경로 집합을 다시 생각할 수 있습니다.

이것은를 사용하는 마이그레이션 / 재구성에 적용됩니다 svndumpfilter. 지금 약간의 추가 작업으로 나중에 많은 추가 작업을 절약 할 수 있으며, svndumpfilter향후 마이그레이션 / 재구성을 위해 쉽게 사용할 수 있도록 유지함으로써 상대적으로 저렴한 비용으로 위험을 완화 할 수 있습니다.


"svn move"가 충분하지 않은 이유는 무엇입니까? 당신의 제안은 큰 망치로 파리를 짓밟는 것 같습니다.
Rob Williams

이 1.4 동작에 물린 적이 있습니다. SVN 저장소에 디렉터리 또는 분기 / 태그의 이동 (이름 변경)이 포함 된 경우 svndumpfilter를 사용하여 저장소를 새 구조로 재구성 / 마이그레이션하는 데 도움이 될 수 있습니다. 이는 기록을 처리하지 않기 때문에 실패 할 수 있습니다. 잘. 문서화되어 있으며 심판을 파헤칠 것입니다. 만약 당신이 좋아한다면
Ken Gentle

이 동작에 대한 참조를 추가 할 수 있습니까?
Jacco

2

위의 답변은 작동하지만 모범 사례는 아닙니다. 최신 svn 서버 및 클라이언트 트랙이 병합됩니다. 따라서 svn은 브랜치에 병합 한 수정 내용과 위치를 알고 있습니다. 이는 분기를 최신 상태로 유지 한 다음 다시 트렁크에 병합 할 때 많은 도움이됩니다.

그러나 어떤 버전의 Subversion을 사용하든 상관없이 브랜치의 변경 사항을 트렁크로 다시 가져 오는 모범 사례 방법이 있습니다. 이는 Subversion 매뉴얼 : Version Control with Subversion, 4 장. 분기 및 병합, 분기 동기화 유지에 설명되어 있습니다.


공식 정보에 대한 Thx를 통해 공식 승인으로 분기를 트렁크에 병합 할 수 있습니다. 키워드는 reintegrate입니다
Junyo

-3

SVN에서는 정말 이상하고 비정상적인 구성입니다. 어쨌든 "좋은 습관"이 아니라고 생각하더라도 다음과 같이 할 수 있습니다.

  • 모든 소스 트리를 확인하십시오 (svn co therootsourcetree)
  • 트렁크 제거 (svn rm 트렁크)
  • 브랜치를 트렁크에 복사합니다 (svn cp 브랜치 / thebranch / trunk).
  • 브랜치 제거 (svn rm 브랜치 / thebranch)
  • 변경 사항 커밋

행운을 빕니다


9
이것은 "svn move"에 의해 보존 될 역사의 흔적을 파괴합니다.
Rob Williams
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.