Git 변환: SVN에서 Git으로 마이그레이션하는 단계
SVN에서 Git으로 마이그레이션하는 다음 단계는 SVN 리포지토리의 콘텐츠를 새 Git 리포지토리로 가져오는 것입니다. 이 단계는 대부분의 Git 배포에 포함된 git svn
유틸리티를 사용하여 수행한 다음, svn-migration-scripts.jar
*로 결과를 클린업합니다.
로컬 SVN 리포지토리에서 복제하는 경우에도 리포지토리가 큰 경우 변환 프로세스에 상당한 시간이 걸릴 수 있습니다. 참고로 메인에 33,000개 커밋이 있는 400MB 리포지토리를 변환하는 데 약 12시간이 걸렸습니다.
웬만한 크기의 리포지토리라면 마이그레이션 책임자의 컴퓨터에서 다음 단계를 실행해야 합니다. 단, SVN 리포지토리가 매우 큰데 변환 시간을 줄이고 싶다면 마이그레이션 책임자의 로컬 컴퓨터가 아니라
SVN 서버에서 git svn 복제를 실행해도 됩니다. 그러면 네트워크 연결을 통한 복제의 오버헤드를 피할 수 있습니다.
*이 스크립트는 git 버전 1.8.x만 지원되는 시점에 작성되었습니다. 따라서 해당 스크립트를 작동하려면 해당 버전의 git을 사용해야 합니다.
SVN 리포지토리 복제
git svn 복제 명령어는
SVN 리포지토리의 트렁크와 브랜치, 태그를 새 Git 리포지토리로 변환합니다. 현 SVN 리포지토리의 구조에 따라 명령어를 다르게 구성해야 할 수도 있습니다.
관련 자료
전체 Git 리포지토리를 이동하는 방법
솔루션 보기
Bitbucket Cloud에서 Git에 대해 알아보기
표준 SVN 레이아웃
SVN 프로젝트가 표준 /trunk
, /branches
, /tags
디렉토리를 이용하고 있다면 리포지토리의 구조를 수동으로 지정하는 대신 --stdlayout
옵션을 사용할 수 있습니다. 디렉토리 ~/GitMigration에서
다음 명령을 실행합니다.
git svn clone --stdlayout --authors-file=authors.txt
<svn-repo>/<project> <git-repo-name>
여기서
는 마이그레이션하고자 하는 SVN 리포지토리의 URI이고,
는 가져오려고 하는 프로젝트의 이름이며,
은 새 Git 리포지토리의 디렉터리 이름입니다.
예를 들어, https://svn.atlassian.com에서 호스팅되고 있는 Confluence라는
프로젝트를 마이그레이션한
경우 다음을 명령을 실행할 수도 있습니다.
git svn clone --stdlayout --authors-file=authors.txt https://svn.atlassian.com/Confluence ConfluenceAsGit
비표준 SVN 레이아웃
SVN에 표준 레이아웃이 없다면 --trunk
, --branches
, --tags
명령행 옵션을 이용해 트렁크, 브랜치, 태그의 위치를 제공해야 합니다. 예를 들어, 브랜치가 /branch
디렉토리와 /bugfixes
디렉토리에 모두 저장돼 있다면 다음 명령어를 사용합니다.
git svn clone --trunk=/trunk --branches=/branches
--branches=/bugfixes --tags=/tags --authors-file=authors.txt
<svn-repo>/<project> <git-repo-name>
새 Git 리포지토리 검사
git svn clone
이 완료되면(시간이 걸릴 수 있음) ~/GitMigration
에 <git-repo-name>
이라는 새 디렉터리가 생깁니다. 이것이 변환된 Git 리포지토리입니다. 사용자는
으로 전환하고 표준 Git 명령을 실행하여 프로젝트를 탐색할 수 있습니다.
브랜치와 태그를 예상대로 새 Git 리포지토리로 가져오지 못했습니다. git 브랜치 출력에서 SVN 브랜치가 보이지 않고 git 태그 출력에서도
SVN 태그를 찾을 수
없습니다. 그러나 Git 브랜치 -r을 실행하면 SVN 리포지토리의
브랜치와 태그가 모두 보일 것입니다. Git svn 복제 명령이 SVN 브랜치를
원격 브랜치로 가져오고 SVN 태그를 tags/라는 접두사가 붙은
원격 브랜치로 가져옵니다.
이 같은 작동으로 일부 양방향 동기화 절차가 더 간편해지기도 하지만 단방향 마이그레이션 Git를 시도할 때에는 매우 혼동스러울 수도 있습니다. 따라서 다음 단계에서 이러한 원격 브랜치를 로컬 브랜치와 실제 Git 태그로 변환합니다.
새 Git 리포지토리 정리
svn-migration-scripts.jar에 들어 있는
clean-git 스크립트
가SVN 브랜치를 로컬 Git 브랜치로, SVN 태그를 완벽한 Git 태그로 변환합니다. 이는 파괴적인 작업으로서, Git 리포지토리에서 SVN 리포지토리 커밋을 다시 이동할 수 없습니다.
본 마이그레이션 가이드에서는 SVN에서 Git로 단방향 동기화를 선호하므로 본 가이드를 따르고 있다면 이는 문제가 되지 않습니다. Git 리포지토리는 마이그레이션 단계가 완료될 때까지 읽기 전용으로 인식됩니다. 그러나 마이그레이션 프로세스 중 Git 리포지토리와 SVN 리포지토리에 커밋을 계획하고 있다면 다음 명령은 실행하면 안 됩니다. 이는 고급 작업으로 일반 프로젝트에서는 사용하지 않는 것이 좋습니다.
정리 가능한 대상을 보려면 ~/GitMigration/
에서 다음 명령을 실행하면 됩니다.
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git
그러면 해당 스크립트가 변경하고자 하는 내용이 모두 출력되지만 실제로는 하나도 변경되지는 않습니다. 이 변경을 실행하려면 --force
옵션을 다음과 같이 사용해야 합니다.
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git --force
이제 git 브랜치
출력에 SVN 브랜치가 모두 보일 것입니다. git 태그
출력에 SVN 태그도 보일 것입니다. 이것은 SVN 프로젝트가 Git 리포지토리로 성공리에 변환되었다는 의미입니다.
요약
이 단계에서는 git svn 복제
명령으로 SVN 리포지토리를 새 Git 리포지토리로 변환했고 svn-migration-scripts.jar로
최종 리포지토리의 구조를 정리했습니다. 다음 단계에서는 이 새 Git 리포지토리를 SVN 리포지토리에 대한 새 커밋과 동기화 상태를 유지하는 방법에 대해 알아봅니다. 이것은 변환과 비슷한 과정이지만 이 전환 중에는 몇 가지 중요한 워크플로우를 고려해야 합니다.
이 문서 공유
다음 토픽
여러분께 도움을 드릴 자료를 추천합니다.
이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.