GitNotes.36-2.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 36.2: Atlassian 의 변환 툴을 이용하여 SVN 에서 Git 으로 이주(migrate) 하기

Atlassian 변환 유틸리티는 이곳 에서 받을 수 있다. 이 유틸리티는 Java 를 필요로 하므로, 변환을 수행하려고 하는 컴퓨터에 Java 실행환경 (JRE) 이 설치되어 있는지 확인이 필요하다.

java -jar svn-migration-scripts.jar 명령어 실행 시, 해당 컴퓨터에서 변환에 필요한 프로그램 중 빠진 부분이 있는지를 검사하여 준다. 세부적으로 이 명령어는 Git, subversion, 그리로 git-svn 이 설치되어 있는지를 확인한다. 또한 변환 작업이 대소문자를 구별하는 (case-sensitive) 파일시스템에서 수행되고 있눈지를 검사한다. 저장소를 손상시키지 않기 위하여, Git 으로의 변환은 대소문자를 구별하는 파일시스템에서 수행되어야 한다.

다음으로는, 작성자 (author) 정보 파일을 생성하여야 한다. Subversion 은 변경사항을 comitter 의 사용자 이름만을 가지고 추적(track) 하게 되어 있으나, Git 은 사용자를 구별하기 위하여 두가지의 정보를 사용하게 되어 있다: 실제 이름 (real name) 과 이메일 주소가 바로 그것이다. 아래 명령어는 subversion 사용자 이름을 git 에서의 대응 정보로 변환하는 매핑 파일을 생성한다:

java -jar svn-migration-scripts.jar authors <svn-repo> authors.txt

위 예제에서 는 변환을 수행하고자 하는 SVN 저장소의 URL 이다. 해당 명령 실행 시, 각 contributor 들의 신원 (identification) 정보는 authors.txt 에 매핑될 것이다. 이메일 주소는 @mycompany.com 형식으로 구성될 것이다. 생성된 authors 파일 내의 각 사람들의 기본 이름 (기본적으로 사용자 이름으로 되어 있다) 을 실제 이름으로 변환하는 작업은 수동으로 수행하여야 한다. 작업 수행시, 각 사람들의 이메일 주소 역시 올바르게 입력되었는지 확인이 필요하다.

이후 아래 명령어를 이용하여, SVN 저장소를 Git 저장소로 clone 할 수 있을 것이다:

git svn clone --stdlayout --authors-file=authors.txt <svn-repo> <git-repo-name>

는 위에서 사용된 URL 과 동일한 값이며 은 현재 디렉토리에서 새로 저장소를 clone 시킬 하부 디렉토리 이름이다. 이 명령어를 사용하기 전에, 몇가지 고려해야할 사항들이 있다:

  • 위에 표시된 --stdlayout 옵션은 git 에게 해당 저장소가 trunk, branches, 그리고 tag 디렉토리로 이루어진 표준 SVN 구조를 사용하고 있다는 것을 알려주게 된다. 표준 구조를 따르지 않는 Subversion 저장소에 대해서는, trunk 디렉토리와 일부/전체에 대한 branch 디렉토리, 그리고 tags 디렉토리의 위치를 명시하여야 한다. 이 작업은 다음과 같은 예제를 참고한다:
    git svn clone --trunk=/trunk --branches=/branches --branches=/bugfixes --tags=/tags --authors- file=authors.txt <svn-repo> <git-repo-name>
  • 이 명령어는 저장소의 규모에 따라 몇 시간이 걸릴 수도 있다.
  • 대규모 저장소의 경우 변환 시간을 단축하기 위해, subversion 을 호스팅하고 있는 서버에서 변환을 직접 수행하는 방법을 통해 네트웍상의 부하를 제거할 수 있다.

git svn clone 은 subversion branch 들을 (trunk 를 포함하여) 원격 branch로, subversion tags 들은 tags/ 라는 접두어가 붙은 원격 branch 로 import 한다. 이들을 실제 branch 와 tag 들로 변환하고자 한다면, 아래 명령어를 기술된 순서대로 Linux 머신에서 실행하도록 한다. 아래 명령어를 실행하고 나면, git branch -a 명령어는 올바른 branch 이름을 표시해 줄 것이며, git tag -l 명령어는 저장소의 tag 들을 표시해 줄 것이다.

git for-each-ref refs/remotes/origin/tags | cut -d / -f 5- | grep -v @ | while read tagname; do git tag $tagname origin/tags/$tagname; git branch -r -d origin/tags/$tagname; done git for-each-ref refs/remotes | cut -d / -f 4- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/origin/$branchname"; git branch -r -d "origin/$branchname"; done

여기까지 수행하였다면 SVN 으로부터 Git 으로의 변환이 마무리 되었을 것이다. 로컬 저장소를 서버로 push 하고나면, SVN 으로부터의 version history 를 유지하면서도 Git 을 이용하여 개발을 진행할 수 있을 것이다.

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형

+ Recent posts