SVN에서 GIT으로 커밋 이력과 함께 이관하기

2020-04-25

우선 GitLab에 빈 Repository를 생성합니다.

SVN으로부터 소스코드 체크아웃

그리고 빈 폴더를 하나 생성하고 SVN으로 부터 소스코드를 받습니다.

svn checkout svn://123.456.7.890:8080/test/svn

위의 명령어를 사용하면 쉽게 체크아웃을 받을 수 있습니다. 물론 TortoiseSVN을 설치해야 svn 명령어를 git bash에서도 사용할 수 있습니다. 명령어 쓰는 게 훨씬 편하니 이번 기회에 다운합니다. 설치할 때는 무작정 다음을 누르면 안 되고 command line 명령어를 사용할 수 있게 변경해 주어야 하는 점에 유의합니다.

users.txt 파일 생성 (여기부터 소스코드 폴더 내에서 작업)

.svn 폴더가 있는 폴더에서 작업을 시행해야 합니다. svn info를 사용해서 동작하면 올바른 디렉토리 입니다.

SVN의 커밋이력을 옮기려면 사용자 정보가 있어야 할 것입니다. 그래서 해당 SVN Repository에 있는 사용자 정보를 취합하겠습니다.

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

위 명령어를 git bash에서 사용하면 텍스트 파일이 하나 생성되는데 park = park <park> 이런 식으로 되어있는 정보를 park = park <park@test.com> 형식으로 변경해서 txt 파일을 저장해두시면 됩니다. 우항의 정보만 변경해주면 됩니다. park = 별칭 <git email> 이 파일에 있는 정보를 기반으로 git에 커밋 이력을 옮깁니다.

Git 초기화, 생성

git svn init --no-metadata svn://123.456.7.890:8080/test/svn

이관하려는 svn에 맞게 git을 로컬에 생성하고 초기화 시킵니다.

Git 설정

위에서 생성한 유저 목록이 적혀있는 파일과 유저 정보를 설정한다.

git config svn.authorsfile ../users.txt (파일있는 경로)
git config --global user.name Park
git config --global user.email park@test.co.kr

SVN 커밋 이력을 Git으로 마이그레이션

git svn fetch 명령어를 통해 이제 svn으로 부터 로컬 git repostiory에 이관시킵니다. 인증을 요구하면 svn에서 사용했던 ID/PW를 입력하면 됩니다. 커밋 이력이 많으면 오래걸립니다.

git push를 위한 폴더 생성과 복사

이제 지금까지 작업한 소스를 다른 폴더에 넣고 Git에 업로드 하겠습니다.

디렉토리 구조를 한번 짚고 넘어가자면 svn_source가 지금까지 작업했던 디렉토리의 대략적인 모습이고 for_git_push 폴더가 업로드를 위해 새롭게 생성한 폴더입니다.

이제 소스코드 폴더 내에서 git clone . ../(생성한 폴더명) 명령어를 통해 지금까지 작업했던 소스를 옮깁니다. 이미지 디렉토리를 예시로 든다면 svn_source 폴더 내에서 git clone . ../for_git_push로 코드를 옮길것입니다.

gitignore.io 사이트를 활용하여 .gitignore를 생성하여 새롭게 생성한 폴더에 넣어줍니다.

그리고 cd ../(생성한 폴더명)으로 이동하여 이제는 신규 폴더에서 작업합니다.

원격 Repository 정보 등록 (여기서부터 신규 폴더에서 작업)

git remote add TEST_GIT git@123.456.7.89:test/blog.git git remote add 별칭 Git Repository 주소

위와 같은 형식의 명령어를 통해 등록합니다.

지금까지 작업한 설정 검토

신규 폴더내에서 숨겨져 있는 폴더를 보시면 .git이라는 폴더안에 config 파일이 있을 것입니다.

[core]
	repositoryformatversion = 0
	filemode = true // 확인
	bare = false
	logallrefupdates = true
	ignorecase = true
[branch "master"]
	remote = TEST_GIT // 확인
	merge = refs/heads/master
[remote "TEST_GIT"]
	url = git@123.456.7.89:test/blog.git
	fetch = +refs/heads/*:refs/remotes/TEST_GIT/*

파일을 열어서 위와 같은 형식으로 되어 있는지 확인을 하고 그렇지 않다면 filemode와 remote 별칭 부분을 수정하여 저장합니다.

대망의 소스코드 업로드

GitLab의 경우 본인이 Developer로 설정되어 있다면 push를 할 권한이 없으므로 관리자에게 여쭈어 권한을 수정하고 push를 진행합니다.

git rm -r --cached .
git add .
git commit -m "이관"
git push

push에 성공해도 GitLab에서 확인을 했을 때 SVN에서 작성했던 커밋 이력이 옮겨져 있지 않다면 제대로 되지 않은 것이니 Repository를 다시 생성해서 처음부터 다시 해보는게 좋습니다.

출처 : https://scvspace.kr/1385#Git-1