(원문 http://www.sailmaker.co.uk/blog/2013/05/05/migrating-from-svn-to-git-preserving-branches-and-tags-3/ )
git svn
을 사용해서 SVN에서 브랜치와 태그를 보존하면서 Git으로 전환하는 것을 설명한다.
$ mkdir staging
$ cd staging
# 'staging'이라고 지정했지만, 반드시 'staging'이라고 할 필요는 없음.
# 하지만 아래에서는 'staging'이라고 지칭할 것임.
# [[SVN_URL]] 변경
$ git svn init [[SVN_URL]] -T Trunk -b Branches -t Tags --prefix=svn/
$ git config --local --list
출력된 것중에 아래와 같은 내용이 있음.
svn-remote.svn.url=svn://svn.example.com
svn-remote.svn.fetch=some/path/trunk:refs/remotes/svn/trunk
svn-remote.svn.tags=some/path/tags/*:refs/remotes/svn/tags/*
$ git svn fetch
리파지토리 크기와 전송속도에 따라 다르지만, 몇분에서 몇시간 사이로 소모된다.
$ git status
결과는
# On branch master
nothing to commit (working directory clean)
그리고 브랜치를 확인해본다.
$ git branch -a
결과는 아래와 비슷한 모양이다.
* master
remotes/svn/tags/0.1.0
remotes/svn/tags/0.2.0
remotes/svn/tags/0.3.0
remotes/svn/tags/0.4.0
remotes/svn/trunk
결과에 브랜치가 없지만, 브랜치가 있는경우 브랜치도 확인할 수 있다.
원격 SVN 브랜치를 로컬 Git 브랜치로.
$ for branch in `git branch -r | grep "branches/" | sed 's/ branches\///'`; do
git branch $branch refs/remotes/$branch
done
SVN 태그는 Git 브랜치로 또는 Git 태그로 변환될 수 있다. 이거는 순전히 마음먹기(정책)에 달려있다.
$ for tag in `git branch -r | grep "tags/" | sed 's/ tags\///'`; do
git tag -a -m"Converting SVN tags" $tag refs/remotes/$tag
done
$ for tag in `git branch -r | grep "tags/" | sed 's/ tags\///'`; do
git branch $tag refs/remotes/$tag
done
원격저장소로 푸시하기 전에 로컬 Git 리파지토리로 푸시하고 클론하여 결과를 테스트
$ cd ~
$ mkdir test
$ cd test
$ git init --bare
~/test 라는 bare 리파지토리가 생성됨.
$ cd ~/staging
$ git remote add test `~/test`
$ git push --all test
$ git push --tags test
--all 옵션이 태그는 푸시하지 않음, 그래서 푸시를 나누어서 해줘야함.
$ cd ~
$ mkdir aclone
$ cd aclone
$ git clone ~/test
테스트 해보고 이상 없으면 원격 저장소로 Push 하면 된다.
$ cd ~/staging
$ git remote add origin [[REAL_HOST_URL]]
$ git push --all origin
$ git push --tags origin
origin 이라 지칭했지만 어떤걸 사용해도 된다. [[REAL_HOST_URL]]은 실제 사용할 원격 리파지토리 주소를 사용해야 한다.
이제 마무리 작업이 남아있다. 테스트로 만들었던 리파지토리들과 스테이징 리파지토리를 삭제한다.
$ cd ~/staging
$ git remote rm test
이제 스테이징 리파지토리에 test라는 원격리파지토리는 삭제됬다.
$ cd ~
$ rm -rf aclone
$ rm -rf test
테스트 리파지토리와 Clone 리파지토리를 삭제하고
$ cd ~
$ rm -rf staging
SVN 리파지토리를 계속해서 fetch해야 한다면 그대로 두는 것을 추천한다. 남겨둔다면, 초기에 fetch 하는 시간을 줄여준다. 하지만, 이제 더이상 fetch하지 않고 Git 리파지토리만 사용한다면 삭제해도 된다.