svn git 이전하기 (마이그레이션)

aaron.park·2020년 5월 19일
2
post-thumbnail

기존 svn으로 관리하던 회사의 소스를 git으로 이전하기로 결정되었다. 이전 작업은 거의 완료되었지만, 이후에 기억이 안날까봐 여기다가 정리해 둔다.

1. 마이그레이션 툴 다운로드

우선 아틀라시안에서 제공하는 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 이상이 필요하다고 한다.

2. svn으로부터 author 정보 추출

기존 히스토리를 이전하려면, 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이다.

3. svn -> git 이전

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 등으로 직접 지정해줘야 한다.

이 작업은 만약 히스토리 혹은 버전 관리 파일이 많을 경우 오래 걸릴 수 있다.

4. svn 연결 끊기

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 = 

5. git 원격 저장소에 push하기

이전이 완료되었다면 지금까지의 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 마이그레이션이 완료되었다!

Reference

https://lux.cuenet.kr/21

profile
애런 퐉의 블로그

0개의 댓글