본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

subversion 저장소를 git로 변환하기



* 프롤로그 

소스관리 툴로 수년간 subversion을 써왔는데 회사 서버를 이전하면서 이번기회에 git로 변환하기로 마음 먹었습니다. 굳이 우리같은 구멍가게(?)에서 git로 이전할 필요가 있을까 하는 문제의식도 생겼지만, 가끔 git나 github를 사용하면서 적용됐던 장점을 반영하고 싶어 결단을 내렸습니다. 처음에 cvs에서 svn으로 넘어왔을때를 떠올려보면 다소간의 귀찮음을 잠깐 견디기만 하면 새로운 툴의 무한한 장점을 영원히 누리리라 믿어 의심히 않습니다.  여러가지 방안을 계획하고 실제 테스트해보다가 가장 맘에 드는 방법을 찾아냈고 이를 기준으로 포스팅합니다. 여기서 사용한 툴은 svn-migration-scripts.jar 입니다. 마이그레이션하는 자세한 방법은 https://www.atlassian.com/git/tutorials/migrating-overview 를 참조 했습니다. 이 포스팅은 변환에 사용할 임시 리눅스 머신에서의 작업을 기준으로 작성되었습니다.


<subversion 저장소> ==========> <임시 리눅스서버> ==========> <git 저장소>






1. 변환 도구 svn-migration-scripts.jar 다운로드

위 링크를 클릭하거나 https://bitbucket.org/atlassian/svn-migration-scripts/downloads 에서 변환도구를 다운로드 합니다.


2. 서버의 시스템이 변환이 가능한지 점검합니다.(JDK나 JRE가 설치되어 있어야 합니다.)

java -jar svn-migration-scripts.jar verify


subversion과 git가 설치되어 있는지 점검합니다. 만일 제대로 설치되지 않은 경우 아래와 같은 에러메시지가 출력됩니다. git와 subversion이 모두 설치 되지 않은 경우입니다.

Git: ERROR: Unable to determine version.

Subversion: ERROR: Unable to determine version.


yum이나 apt-get으로 해당 패키지를 먼저 설치 합니다.

이때 git는 버전 1.7.7.5 이상 subversion은 1.6.17 이상이 필요합니다.


<tip>만일 subversion이 1.6.17임에도 불구하고 "Subversion: ERROR: Unable to determine version" 와 같은 에러가 난다면 아래와 같이 환경변수를 추가해 주면 됩니다.

export LANG=C

or 

export LC_ALL=C


3. svn author 정보 추출(저장소 위치가 http://svn.example.com/project 라고 가정했을 경우)

java -jar svn-migration-scripts.jar authors http://svn.example.com/project {username} {passwd} > authors.txt

{username} 부분과 {passwd} 부분에는 svn 저장소의 사용자이름과 비밀번호가 각각 들어갑니다.


4. authors.txt 파일 편집

authors.txt 파일에는 svn 저장소에 커밋한 사용자 정보가 들어 있는데 이를 git 형식에 맞게 수정해야 합니다. (현재 탈퇴한 사용자라 하더라도 과거 커밋한 사용자라면 목록에 포함되어 있어야 합니다.)

aaa = aaa <aaa@mycompany.com>

bbb = bbb <bbb@mycompany.com>


이 내용을 다음과 같이 수정합니다.(svn은 커밋에 email주소를 사용하지 않지만 git는 email주소가 사용되기 때문입니다.)

aaa = Hong Kil Dong <mrhong@cuenet.co.kr>

bbb = Mazinger Z  <mz@cuenet.co.kr>

아이디 aaa의 실제이름은 "홍길동" 이고 이메일 주소는 <mrhong@cuenet.co.kr> 임을 나타냅니다.


5. svn 저장소 내려받기

git svn clone --stdlayout --authors-file=authors.txt http://svn.example.com/project --username {username} {directory}

{username}은 svn 저장소에 권한이 있는 사용자 이름이고 {directory}는 새로 만들어질 git 저장소의 이름입니다. 이 명령이 제대로 실행되면 {directory}에 해당하는 디렉토리가 생성되고 그 안에 svn저장소의 코드들이 체크아웃 됩니다.


만일 svn 저장소가 표준 구조(branches, tags, trunk)가 아니라면 --stdlayout 옵션 대신 --trunk=/dir1 --branches=/dir2 -- tags=/dir3 등으로 직접 지정해줘야 합니다.


6. 체크아웃된 디렉토리로 이동하기

cd {directory}


7. clean (일종의 svn 저장소와의 관계 끊기?)

java -Dfile.encoding=utf-8 -jar ../svn-migration-scripts.jar clean-git --force


8. 이전할 git 저장소에 커밋(push) 하기 (git 서버 저장소가 git.example.com/project)인 경우

git remote add origin http://{username}@git.example.com/project

git push origin master

git 저장소의 사용자 이름이 {username}일 경우이며 비밀번호를 물어보는데 맞으면 커밋이 완료됩니다. 

이제 git 서버 저장소에서 project 안에 기본 브랜치인 master에 소스가 커밋된 것을 확인할 수 있을 것입니다.


<tip.1>master에 이미 내용이 있어서 덮어 씌우기 위해서는 다음 명령을 실행합니다.

git push origin +master


<tip.2>master가 아닌 다른 브랜치에 커밋하기 위해서는 다음 명령을 실행합니다. ({branchname}은 서버에 생성 할 새로운 브랜치 이름입니다.)

git push origin master:{branchname}