Tag Archives: cvs

CVS to Subversion migration

오늘 1년 가까이 미루어왔던 일을 저질렀습니다. 회사의 CVS 저장소 전체를 Subversion으로 마이그레이션 했습니다. 5년간 작업한 CVS를 옮기면서 몇가지 문제가 발생하긴 했지만 그래도 성공적으로 옮겼습니다.

subversion은 CVS와 가능하면 비슷한 기능과 인터페이스를 제공하면서 부족한 점들을 보완한 버전 관리 도구로, 요즘 오픈 소스 진영에서 많이 사용하고 있습니다. CVS와의 차이점을 살펴보면

1. commit 단위로 버전이 관리됩니다. CVS에서는 파일별로 관리되기 때문에 한번 commit할때 같이 바뀐 파일을 조회하기가 번거롭습니다.

2. repository가 디비로 관리됩니다. 장점도 되고 단점도 됩니다.

3. CVS에 없는 rename, symbolic link등이 지원됩니다.

4. 웹과의 연동이 잘 되어 있습니다. (trac)

5. Client에 공간을 많이 차지합니다. 대신 네트워크는 덜 사용합니다.

자세한것은 subversion 홈페이지 참조하세요.

그리고 trac은 웹기반 통합 개발 관리툴 정도 되는데, 개발할때 부하를 줄 정도로 복잡하지 않고 간단한 기능만 편한 인터페이스로 모아둔 느낌입니다. wiki로 문서를 쉽게 작성할수 있고, 버그 리포팅과 svn 버전 관리와 연동하여 관리가 가능합니다. 역시 자세한 건 trac 홈페이지 참조하시면 되겠습니다.

몇달전에도 cvs2svn 을 이용하여 컨버전하다가 문제가 생겨서 그만둔적인 적이 있었습니다.

사용하는 서버는 FreeBSD고 subversion과 trac을 ports를 이용하여 설치했습니다.

# cd /usr/ports/devel/subversion
# make install
# cd /usr/ports/www/trac
# make install

컨버전 툴인 cvs2svn도 ports를 이용하여 설치하였었지만, 버전이 낮아서 http://cvs2svn.tigris.org에서 받아서 다시 설치했습니다.

시스템에 svn 그룹을 만들고, 사용자들을 svn 그룹에 추가해줬습니다.
그리고 다음처럼 svn repository와 trac 환경을 만들어줬습니다. (편의상 SVNROOT와 TRACROOT 디렉토리로 설명합니다.)

# svnadmin create /SVNROOT
# chgrp -R svn /SVNROOT  (svn 그룹은 만들었다고 가정)
# chmod -R g+w /SVNROOT/db

# trac-admin /TRACROOT initenv
# chown -R www /TRACROOT

이렇게 하고 웹서버에 fast-cgi모듈로 연결해주고, https와 인증을 추가해줬습니다. trac쪽 fastcgi 스크립트는 /usr/local/share/trac/cgi-bin/trac.fcgi 에 있습니다.

여기까지는 큰 어려움 없이 됐고, 웹에서도 잘 접속이됐습니다.

cvs2svn 마이그레이션 하면서 몇가지 문제점이 발생했었는데, cvs2svn을 최신 버전으로 업그레이드하고 cvs2svn 실행할때 몇가지 옵션을 줘서 해결했습니다. 정확한 이유는 모르겠지만 branch 인식을 제대로 못해서 문제가 발생했던거 같습니다. (프로젝트에는 전혀 없는 branch에 대해서 오류가 납니다 –)

# cvs2svn –encoding=euc-kr –existing-svnrepos –trunk-only –trunk=Library -s /SVNROOT /CVSROOT/Library
# cvs2svn –encoding=euc-kr –existing-svnrepos –trunk-only –trunk=Project1 -s /SVNROOT /CVSROOT/Project1
# cvs2svn –encoding=euc-kr –existing-svnrepos –trunk-only –symbol-default=branch –trunk=Project2 -s /SVNROOT /CVSROOT/Project2

CVS의 기존 디렉토리 구조를 유지하고, 다른 프로젝트간에 디렉토리 복사등을 쉽게 하려고 SVN repository를 하나로 잡았습니다. Project2에서 branch 오류가 계속 나서 –symbol-default=branch 옵션을 주어서 해결했습니다. 어차피 branch 했던 코드가 많지 않아서 –trunk-only 옵션으로 메인 branch만 가져왔습니다.

이렇게해서 대충 설정은 끝났고, 네트워크 svn 접속은 ssh를 통하여 접속하도록 하여 별도로 서버(svnserve)를 돌리지는 않았습니다.

따라서 SVN 주소는:

svn+ssh://userid@svn.company.com/SVNROOT

다른 FreeBSD에서 문제없이 checkout 되는거 확인했는데, LANG 환경변수에 따라서 경고가 뜨는데 이건 아직 왜그런지 모르겠습니다.

윈도우즈 클라이언트로는 TortoiseCVS 썼었는데 TortoiseSVN으로 바꿨습니다. http://tortoisesvn.tigris.org 에서 받을수 있습니다. 윈도우즈에서도 위 svn 주소로 접속이 이상없이 됐고, tortoiseCVS와 거의 동일하게 사용할수 있기 때문에 개발자들이 큰 어려움 없이 사용할수 있을것 같네요.