1. 커미터 목록 정리

Subversion 저장소를 checkout 해둔 경로에서 다음 명령어를 입력해서 커미터 목록을 저장한다.

$ svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt

이제 파일 내용을 보면 각 줄마다 커미터 정보가 아래와 같은 형식으로 있을 것이다.

meye = meye <meye>

이것을 아래와 같이 적당히 고쳐준다.

meye = mEye <meye@dev.meye.net>


2. git-svn으로 Subversion 저장소 가져오기

중간 작업들을 하기 위해서 임시로 가져온다.

$ git svn clone [Subversion 저장소 URL] --no-metadata -A authors.txt --stdlayout ~/temp


3. .gitignore 만들기

Subversion 저장소에 설정한 "svn:ignore" 설정들을 .gitignore 파일로 옮기고 커밋한다.

$ cd ~/temp
$ git svn show-ignore -i trunk > .gitignore
$ git add .gitignore
$ git commit -m "svn:ignore 설정을 .gitignore 파일로 변환"


4. Git bare 저장소를 만들기

이제 준비작업은 다 끝났으니 Subversion 저장소를 옮길 Git bare 저장소를 새로 만든다. 이 저장소의 기본 브랜치(HEAD)를 Subversion의 "trunk" 브랜치와 연결해둔다.

$ git init --bare ~/new-bare.git
$ cd ~/new-bare.git
$ git symbolic-ref HEAD refs/heads/trunk


5. Subversion 저장소를 새 Git 저장소로 옮기기

$ cd ~/temp
$ git remote add bare ~/new-bare.git
$ git config remote.bare.push 'refs/remotes/*:refs/heads/*'
$ git push bare

여기까지 끝났으면 이제 Subversion 저장소를 clone 경로는 삭제해도 된다.

$ rm ~/temp

이제 trunk로 되어있는 브랜치 이름을 master로 바꾸자.

$ cd ~/new-bare.git
$ git branch -m trunk master


6. 태그 정리

git-svn은 Subversion의 태그들을 git의 브랜치로 만들어 두기 때문에 이를 git의 태그로 변환하는 과정이 필요하다. 각 줄의 > 는 입력하는 것이 아니고, 하나의 명령을 여러 줄에 걸쳐서 입력할때 쉘에서 보여주는 프롬프트 표시이다.(이제와서 설명하기도 좀 그렇지만, 당연히 $ 표시는 쉘 프롬프트 표시이다.)

$ git for-each-ref --format='%(refname)' refs/heads/tags |
> cut -d / -f 4 |
> while read ref
> do
>  git tag "$ref" "refs/heads/tags/$ref";
>  git branch -D "tags/$ref";
> done


7. 완료

이제, git 저장소가 준비되었다. 새로 만든 bare 저장소(여기서는 new-bare.git)를 적당한 곳에 복사해놓고 사용하면 된다.


[참고]

  • http://john.albin.net/git/convert-subversion-to-git
  • http://john.albin.net/git/git-svn-migrate


+ Recent posts