2012-01-26 3 views
5

우리는 Git로 변환하려는 비표준 Subversion 저장소가 있습니다. 문제는 내가 완전한 역사를 지키기 위해 어디서부터 시작해야할지 모르지만 완전한 혼란으로 끝나지는 않는다는 것이다.Git으로 비표준 Subversion 가져 오기를 처리하는 방법

당사의 저장소는 당사의 제품 제품군에 대한 지난 6 년간의 경력이 있으며 여러 가지 구조 조정을 거쳤습니다. 모든 경우에 핵심 플랫폼 코드베이스와 핵심 플랫폼 상단에 다른 방식으로 결합 된 여러 프로젝트/플러그인이 있습니다.

-- releases (replaced tags; branches for released stable versions of repos) 
-- sandbox (area for misc projects of interest; should have been new repo) 

그런 다음 우리가 이것을 정리와 함께 종료 : 시간이 지남에

-- plugin1 
    - trunk 
    - branches 
    - tags 
-- pluginX 
    - trunk 
    - branches 
    - tags 
-- trunk (core platform) 
    - <various sub dirs) 
-- branches (various feature branches of the entire repository) 
    - refactoring1 
    - refactoringX 
-- tags (various tags of customer releases of full respository) 
    - customerX_1.x 
-- vendor (vendor drops and tracking of 3rd party source deps) 
    - 3rd_party_code_A 
    - 3rd_party_code_X 

은 우리가 더 많은 디렉토리를 포함하는 루트입니다 몇 가지를 추가 :

년의 첫 번째 부부 같은 구조되었다 :

-- trunk 
    - platform 
    - plugin1 
    - pluginX 
-- stable (stable release branches of trunk) 
    - 1.1 
    - 1.2 
-- tags (release points; marks a point on a stable branch) 
    - 1.1.1 
    - 1.1.2 
-- vendor 
-- sandbox 
-- releases (copies of old releases of interest) 

이것이 우리의 역사입니다. 우리가 끝내기를 원하는 것은 잘하면 훨씬 깨끗합니다. 현재 우리는 git 저장소의 기본을 생각하고있다. (기본적으로 이전의 'trunk'디렉토리의 복사본이다.)

- platform 
- plugin1 
- pluginX 

Branches: 
    - stable/1.1 
    - stable/1.2 
Tags: 
    - rel/1.1.1 
    - rel/1.1.2 

자신의 저장소에 샌드 박스와 공급 업체를 추가하고 싶습니다. (이 작업을 수행하는 방법을 모르지만 어쩌면 svn 저장소의 하위 집합 만 가져 오는 방법이 있습니다)

분기 및 태그에 관해서는 'stable'의 코드가 가지로 끝나기를 원합니다. 'tags'의 코드는 안정적인 태그로 끝납니다.

원래 구조의 이전 기록에 대해 가능한 한 많은 기록을 유지하려고하지만 새 저장소를 오염시키지 않으려합니다. 예를 들어 리팩토링 브랜치에서 발생한 변경 사항을 되돌아 볼 수 있다면 꼭 필요한 것은 아니지만 절대적으로 필요합니다.

현재 우리는 진행 방법과 모든 것을 재구성하고 깨끗한 방법으로 가져 오는 방법에 대해 토론하고 있습니다. 우리가 필요로하는 최소한의 방법은 이전의 리포지토리 재구성 모두에서 플랫폼 및 플러그인 코드의 전체 기록을 보유하는 방법입니다. 가능한 경우 가장 최근의 저장소 구조에서 정보를 안정적으로 얻고 싶습니다.

누구든지이 가져 오기를 수행하는 방법에 대한 권장 사항이 있습니까? 예를 들어

:

  • IT는 구조 조정을 통해 전체 기록을 보존 할 수 있습니까?
  • 가져 오기 전에 Subversion 저장소를 어떻게 정리하여 다시 정리해야합니까? 그렇다면 어떻게해야합니까?
  • 우리는 전체 히스토리를 가져온 다음 Git에서 재구성해야합니까?
  • 이 가져 오기를 정리하는 방법에 대한 아이디어가 있으십니까?
+0

plugin1과 pluginX는 기본적으로 자체 트렁크/분기/태그가있는 독립형 repos입니다. – prusswan

+0

그것이 시작된 방법이지만 코드가 모두 동시에 변경되기 때문에 제대로 작동하지 않는 것으로 나타났습니다. 그래서 우리는 두 번째 저장소 구조로 이동했습니다. 이 구조는 지금 우리를 위해 매우 잘 작동하며 우리는 Git과 함께 계속 유지하려고합니다. – Allen

+0

전체 역사를 지키기 위해 어느 경로가 어떤 경로에 매핑되어야하는지, 그리고 많은 인내 (깊은 역사가있는 svn에 대해서는 git-svn 복제가 매우 오랜 시간이 걸린다)를 알아내는 문제라고 생각합니다. 본질적으로 그 트렁크는 어쨌든 (비록 여러분이 그들 중 하나를 브랜치/마스터가되도록 브랜치로 지정할 수는 있지만) 실제로는 브랜치가 될 것입니다. – prusswan

답변

4

상황에 따라 git-svn (기본값 : --follow-parent 옵션 사용)이 그대로 트릭을 수행 할 수 있습니다. 가장 먼저해야 할 일은 몇 가지 git-svn을 실행하고 디렉토리 구조를 돕기 위해 -T, -b-t 옵션을주의 깊게 철자하는 것입니다.

복잡한 디렉토리 구조 기록으로 인해 문제가 발생할 수 있습니다.

저는 최근 SVN 역사가 여러분이 묘사하고있는 것과 매우 유사한 구조 조정을 거친 내 회사의 Subversion 코드를 git으로 마이그레이션하는 매우 유사한 상황에있었습니다. 필자는 하나의 Subversion 저장소에서 여러 개의 Git 저장소 (프로젝트 당 하나씩)로 프로젝트를 구분하기를 원했습니다.

나는 몇 달이 넘는 이력을 마이그레이션하는 것이 중요하지 않다고 결정하여 쉬운 방법을 사용할 수 있었기 때문에 각 프로젝트에 대해 git-svn이 정상적으로 처리 할 수있는 가장 초기 수정본을 결정하고 거기에서 시작하는 기록 만 가져옵니다 (git-svn -r 사용). 이전의 VCS 마이그레이션 (VSN to SVN, 2005)을 처리 한 경험으로 볼 때 장기간의 기록은 거의 언급되지 않았습니다. 어쨌든 이전 Subversion 서버를 읽기 전용 모드로 두는 것이 쉽기 때문에 필요할 경우 사물을 찾는 데 사용할 수 있습니다.

서브 버전의 내역을 정리하는 쉬운 방법을 모른다. svndumpfilter을 사용하여 특정 부분을 제외했다. 운이 좋으면 git-svn이 마술처럼 옳은 일을 할 것이고, 역사는 git log에서 실제로는 svn log에서보다 더 깨끗해 보일 것입니다 (나뭇 가지와 태그를 보는 방법의 차이로 인해). 이러한 종류의 마이그레이션을 수행 할 때 역사의 일반적

, 청결완전성 두 가지 상충되는 목표이다. 다행히도, 그들은 둘 다 정말로 과대 평가됩니다 - 둘 다 실용 주의적 필수품이 아닌 미적 감각에 더 호소합니다.

EDIT : 청결을위한 사이드 팁 : git-svn에서 --prefix 옵션을 사용하면 가져온 브랜치에 고유 한 프리픽스를 부여 할 수 있습니다. 왜냐하면 git에서 다른 브랜칭 규칙을 사용하기 쉽고보기가 쉽기 때문입니다. 나중에 svn 역사.

+0

관심이 있으신가요? 가져 오기를 완료하는 데 얼마나 걸리셨습니까? 1 억 개 이상의 리비전으로 시도한 리포에 대해 4 일 이상 걸렸습니다. (실제로 물건을 느리게하는 태그가 많이 있습니다.) – prusswan

+1

@prusswan : 시간이 좀 걸릴 수 있습니다. 내가 한 첫 번째 일은 svn을 사용하여 로컬 svn 저장소를 설정했기 때문에 git-svn이 로컬에서 작업하게되었습니다. 그 후, 그들은 거의 빠르게 (느린 것의 경우 최대 1/2 - 1 시간), 10k 개정을 약간 넘는 레포로 작업했습니다. – Avi

+0

svnsync는 흥미로운 가능성이 있습니다. 공유 주셔서 감사합니다. – prusswan

관련 문제