기존 svn으로 관리하던 회사의 소스를 git으로 이전하기로 결정되었다. 이전 작업은 거의 완료되었지만, 이후에 기억이 안날까봐 여기다가 정리해 둔다.
우선 아틀라시안에서 제공하는 svn 마이그레이션 툴을 다운로드 받는다.
https://bitbucket.org/atlassian/svn-migration-scripts/downloads/
다운로드 받았다면 받은 경로에서 터미널을 열고, 마이그레이션 가능한지 검증해본다.
java -jar svn-migration-scripts.jar verify
만약 아래처럼 나온다면, git혹은 svn이 설치가 되지 않은 것이다. 설치해주자.
Git: ERROR: Unable to determine version.
Subversion: ERROR: Unable to determine version.
이때 git는 버전 1.7.7.5 이상 subversion은 1.6.17 이상이 필요하다고 한다.
기존 히스토리를 이전하려면, svn 저장소로부터 author 정보를 추출해야 한다. 앞에서 받은 마이그레이션 툴을 이용해 이 정보를 추출할 수 있다.
java -jar svn-migration-scripts.jar authors svn://svn.example.com/project {username} {passwd} > authors.txt
{username}에는 svn 계정 이름, {passwd}에는 패스워드를 넣으면 된다. 그러면 아래와 같은 형태로 author 정보가 authors.txt로 추출될 것이다.
추출된 authors.txt를 열어보면 다음과 같다.
aaa = aaa <aaa@mycompany.com>
bbb = bbb <bbb@mycompany.com>
왼쪽은 svn이름, 오른쪽은 git 이름과 이메일 주소이다(커밋 히스토리를 git에 등록하기 위해서는 이메일 주소가 필요하다). 오른쪽 이름을 각각 맞게 바꾸어 주면 된다.
aaa = Hong Kil Dong <mrhong@ylland.net>
bbb = Mazinger Z <mz@ylland.net>
svn 사용자인 aaa의 이름은 홍길동이고, 이메일 주소는 mrhong@ylland.net이다.
git svn clone
이라는 명령어를 통해, svn 저장소를 git 저장소로 다운로드 받는다. 이때 앞에서 만든 authors.txt를 사용해 히스토리를 주입해 준다.
git svn clone --stdlayout --authors-file=authors.txt svn://svn.example.com/project --username {username} {directory}
{username}은 svn 저장소 이름이고, {directory}는 이전될 git 로컬 저장소이다. 기존 원격 svn 저장소에 있던 코드들은 {directory}안으로 저장될 것이다.
만일 svn 저장소가 표준 구조(branches, tags, trunk)가 아니라면 --stdlayout 옵션을 빼던가, 혹은 --trunk=/dir1 --branches=/dir2 -- tags=/dir3 등으로 직접 지정해줘야 한다.
이 작업은 만약 히스토리 혹은 버전 관리 파일이 많을 경우 오래 걸릴 수 있다.
git svn clone
이 완료되었다면 기존 svn연결을 끊어줘야 한다. {directory}로 이동해 svn과의 연결을 끊는다.
cd {directory}
java -Dfile.encoding=utf-8 -jar ../svn-migration-scripts.jar clean-git --force
그런데 만약 표준구조로 다운받지 않았다면, branches나 tags의 clean에 실패하여 오류가 날 수 있다.
Could not retrieve the config for the key: branches
그럴때엔 {directory}/.git/config 파일을 열어 branches와 tags의 필드를 추가한다(값은 생략한다).
[svn-remote "svn"]
url = svn://svn.example.com/project
branches =
tags =
이전이 완료되었다면 지금까지의 svn 커밋 사항이 git의 기본 branch인 master에 커밋되어 있을 것이다. 이제 github 등 git 저장소에 이전한 저장소를 push하기만 하면 된다. 먼저 원격지(origin)를 등록한 다음, push한다.
git remote add origin http://{username}@git.example.com/project
git push origin master
원격지에 소스가 반영되었으면 된 것이다. 이것으로 svn git 마이그레이션이 완료되었다!