Post

svn을 사용하는 곳에서 git으로 버전 관리하기

목차


개요

Git은 현재 svn보다 더 많은 기능과 플러그인을 지원하기 때문에 svn에 비해 히스토리 관리도 쉽고 병합, 분기도 더 쉽게 할 수 있다.

그러나 레거시 프로젝트에서는 svn을 주로 사용하고, svn 시스템과 연동하여 사용하고 있는 것 (이슈 트래커 등)들이 많을수록 깃으로 전환하기가 어려울 것이다.

이 때 git-svn을 통해 svn의 히스토리를 git으로 손실 없이 가져와 svn 형상관리를 유지하면서도 git을 통해 히스토리를 살펴보는 등의 기능을 사용할 수 있는 방법을 기술한다.

svn의 모든 기능을 완벽하게 지원하는 것이 아니며 svn의 branch 등의 기능은 git-svn에서 지원하지 않는 것으로 확인되었다.

필요 라이브러리

1
apt-get install git-svn

SVN -> Git

  1. 디렉토리 생성
1
2
mkdir test
cd test
  1. Git Init
1
git init
  1. git svn setting
  • git svn init 진행
1
2
3
git svn init svn://<SVN IP>/<SVN PATH> --prefix=origin/ --svn-remote <원하는 이름>

# example ) git svn init svn://svn.iasdf.com/testjenkins --prefix=origin/ --svn-remote jenkins
  • .git/config 열어 파일 수정

<remote branch name> 에 자신의 로컬 브랜치 이름 또는 원하는 브랜치 이름을 넣어준다.

1
2
3
4
5
6
[svn-remote "<원하는 이름>"]
	url = svn://<SVN IP>/<SVN PATH>
-   fetch = :refs/remotes/origin/git-svn
+   fetch = :refs/remotes/origin/<remote branch name>

# example ) fetch = :refs/remotes/origin/master
  1. git svn fetch 이 때 --svn-remote 옵션을 준 사람은 해당 옵션값으로 fetch 진행한다.
1
2
3
git svn fetch

git svn fetch <svn remote name>
  1. rebase 하여 svn에서 가져온 정보를 업데이트한다.

rebase하는 브랜치 명은 .git/config 파일에 넣었던 <remote branch name> 이다.

1
2
3
git rebase remotes/origin/<remote branch name>

# 예시 ) git rebase remotes/origin/master

이후 svn의 정보를 가져올 때에는 fetch와 rebase만 진행하면 된다.

Git의 변경사항을 SVN에 반영

README.md를 수정하였음.

  1. add
1
git add README.md
  1. 변경내용 커밋
1
git commit -m "README.md 수정"
  1. git svn dcommit 사용
1
git svn dcommit

dcommit 시 변경내용이 반영된다.

만약 git svn fetch를 실행하고 변경 파일 또는 untracked 존재하는 경우 다음과 같은 방법을 사용해본다.

1
git update-index --assume-unchanged <file>
This post is licensed under CC BY 4.0 by the author.