유행에 동참하고자(는 거짓말이고) 서브버전에서 깃으로 이전을 감행하고야 말았다. Git의 관리자 기능을 마지막으로 건드려본 지 오래라 처음부터 다시 공부하는 느낌이라 반나절이 꼬박 걸렸지만 결과는 좋다.
계획
Assembla라는 호스팅 서비스에 SVN 저장소를 두고 사용하던 참이다. 전반적인 이전 계획은 다음과 같다.
- 서브버전 저장소를 읽기 전용으로 돌린다. (Assembla가 기능을 제공한다)
- 로컬 컴퓨터에서 서브버전 저장소 전체(trunk, tags, branches)를 Git 저장소로 변환한다.
- 로컬에 만든 Git 저장소를 Assembla에 올린다.
말하자면 원격 SVN 저장소를 로컬에서 Git으로 변환해 다시 원격 Git 저장소로 옮기는 것이다.
난점
일반적인 경우라면 크게 어려운 작업은 아닌데 호스팅 서비스를 받다 보니 조금 더 귀찮긴 하다. 이를테면,
- SVN에서 쓰던 계정 이름이 사람마다 닉네임, 실제 이름, 이메일 주소 이렇게 세 가지로 나뉘었기 때문에 Git의 관례에 따라 이름 + 이메일 주소로 정리해야 한다.
- 서버 접속 권한이 없기 때문에 로컬 Git 저장소를 원격 서버에 직접 복사하는 건 못 한다.
시작!
서브버전 저장소를 읽기 전용으로
이렇게 하면 된다! 간단하다!
Git 저장소로 변환하기
Converting a Subversion repository to Git을 그대로 따라하면 된다. 부연 설명하자면,
- Retrieve a list of all Subversion committers에서는 1번 난점을 해결한다. SVN의 계정을 Git의 이름 + 이메일 관례에 맞춰 편집한다.
-
Clone the Subversion repository using git-svn에서는 SVN 저장소에서 trunk, branches, tags를 모두 가져와 로컬 Git 저장소를 만든다.
-
예제에선--no-metadata
스위치를 붙이는데 제대로 변환하려면 이 옵션은 떼자. 세부 사항은 Is there an advantage to using –no-metadata in git svn clone?에서 확인하자. -
--std-layout
은 SVN 저장소가 관례에 따라 trunk, branches, tags 구조로 되어 있음을 명시한다.
-
-
Convert svn:ignore properties to .gitignore에선
svn:ignore
에 지정된 값을 가져와 그에 대응하는.gitignore
파일을 만든다. - Push repository to a bare git repository부터 Clean up branches and tags까지에선 로컬에 만든 Git 저장소를 다시 변환해 Git의 관례와 일치하는 구조로 새로운 Git 저장소를 만든다.
로컬 Git 저장소를 원격 저장소에 복사하기
우선 새로 만든 Git 저장소 폴더로 이동한다. Converting a Subversion repository to Git의 예제를 그대로 따라 했다면
cd ~/new-bare.git
이제 로컬 저장소를 원격 저장소에 밀어 넣는다.
git push [email protected]:myproject.git --mirror
간단하다. 여기서 눈여겨 볼 부분은 --mirror
옵션이다. 이 옵션을 사용해야 master를 비롯한 모든 브랜치와 모든 태그가 고스란히 원격 저장소로 올라간다.