1. 개요


SVN 저장소를 Git으로 이관하려면 svn2git 패키지를 이용한다.

2. 사전요구 사항


svn2git은 ruby로 개발된 패키지 입니다. 사용을 하기 위해서는 사전에 ruby가 설치되어 있어야 한다. ruby설치와 관려된 문서는 아래 링크를 참조한다.

https://www.ruby-lang.org/ko/documentation/installation/

svn2git 설치와 관련된 문서는 아래 링크를 참조한다.

https://docs.gitlab.com/ee/user/project/import/svn.html

3. 이관


1. svn 저상소 checkout하기 위한 폴더를 생성하고 생성된 폴더로 이동한다.

cd sample

2. 작업자 정보를 이관하기 위해 .svn2git 폴더를 생성하고 생성된 폴더에 authors 파일을 생성한다. (아래 작업자 이관 항목 참조)

mkdir ~/.svn2git
vi ~/.svn2git/authros

3. svn2git 명령어를 이용해서 svn 저정소의 파일을 내려받고 로컬 git 저장소로 변환한다.

svn2git SVN_URL  --username NAME  --authors ~/.svn2git/authors

4. 그외 자세한 옵션은 아래표를 참조 한다.

Usage: svn2git SVN_URL [options]                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                               
Specific options:                                                                                                                                                                                                                                                              
        --rebase                     Instead of cloning a new project, rebase an existing one against SVN                                                                                                                                                                      
        --username NAME              Username for transports that needs it (http(s), svn)                                                                                                                                                                                      
        --password PASSWORD          Password for transports that need it (http(s), svn)                                                                                                                                                                                       
        --trunk TRUNK_PATH           Subpath to trunk from repository URL (default: trunk)                                                                                                                                                                                     
        --branches BRANCHES_PATH     Subpath to branches from repository URL (default: branches); can be used multiple times                                                                                                                                                   
        --tags TAGS_PATH             Subpath to tags from repository URL (default: tags); can be used multiple times                                                                                                                                                           
        --rootistrunk                Use this if the root level of the repo is equivalent to the trunk and there are no tags or branches                                                                                                                                       
        --notrunk                    Do not import anything from trunk                                                                                                                                                                                                         
        --nobranches                 Do not try to import any branches                                                                                                                                                                                                         
        --notags                     Do not try to import any tags                                                                                                                                                                                                             
        --no-minimize-url            Accept URLs as-is without attempting to connect to a higher level directory                                                                                                                                                               
        --revision START_REV[:END_REV]                                                                                                                                                                                                                                         
                                     Start importing from SVN revision START_REV; optionally end at END_REV                                                                                                                                                                    
    -m, --metadata                   Include metadata in git logs (git-svn-id)                                                                                                                                                                                                 
        --authors AUTHORS_FILE       Path to file containing svn-to-git authors mapping (default: ~/.svn2git/authors)                                                                                                                                                          
        --exclude REGEX              Specify a Perl regular expression to filter paths when fetching; can be used multiple times                                                                                                                                               
    -v, --verbose                    Be verbose in logging -- useful for debugging issues                                                                                                                                                                                      
        --rebasebranch REBASEBRANCH  Rebase specified branch.                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                               
    -h, --help                       Show this message                                                                                                                                                                                                                         


5. trunk, branches, tags 구조를 사용하지 않는 SVN 저장소는 --notrunk,  --nobranches,  --notags 옵션을 사용해야 한다.

6. 생성한 로컬 git 저장소를 remote에 push

git remote add origin GIT_URL
git push -u origin master

7. svn에 tags가 있을 경우

git push --tags origin

8. 모든 브랜치 푸시

git push --all origin

4. Authors 파일


매핑 파일은 svn id = git 계정 정보를 이력한다. svn 저상소 checkout하기 위한 폴더를 생성하고 생성된 폴더로 이동한다.

Hong = Hong <hong@never.com>

svn의 commit id 정보는 svn 로컬 저장소에서 아래 명령어를 이용해서 확인할 수 있다.

svn log|grep "^r[0-9]"|awk -F\| '{print $2}'| sed -e 's/^[ \t]*//'|sort|uniq