cvs와 svn을 사용하면서 느끼는 점은, 우열을 가리긴 모호하다는 것이다.
cvs가 나은점도 있고, svn이 나은점도 있고,
이러한 모호함 때문에 일단 회사 개발소스는 cvs로 유지중이긴 하지만...
거두절미하고, svn은 cvs의 단점을 개선하기 위해 만들어진건데
가장 큰 변경사항은
svn에서 디렉토리 이동이 편해졌다는 점이다.
cvs은 특정 소스의 위치를 변경하거나, 하위 디렉토리의 위치를 변경하기 위해서는
소스를 새로운 곳에 새롭게 Add 하고 기존의 파일을 Delete 해야 해서
이력추적을 할 수 없게 되지만, svn에서는 이력추적이 가능해진다.
일단 사소한 것들을 고고싱 (기준은 CVS)
SVN의 장점
1. 디렉토리 이동이 편리함
안정화된 프로젝트라면 상관없지만, 프로젝트 초기에는
디렉토리 이동이나 파일 삭제/이름 변경이 빈번한데
cvs는 이러한 이력을 남길수가 없기 때문에, 초기 프로젝트 셋업시에는 svn이 매우 편리함.
(이동도 편리하지만, 그에 비해 이력이 따라와서 과거의 변경점이 유지 된다는 부가적인 장점)
2.
오프라인 사용이 용이함
확실하게 어느정도까지 오프라인 사용이 가능한지는 모호하지만, 최소한
마지막 버전과 Diff가 가능하다.
cvs에서는 항상 서버와 비교를 하기 때문에 소스 변경사항이 있는건 알아도
어떤 내용이 서버와 차이가 있는지 알수 없지만, svn 에서는 오프라인에서도 diff가 가능함
(svn 자체적으로 데이터를 유지하고 있음 = 받는 측 용량 부담 증가)
3.
서버 하드공간이 절약됨
cvs을 cvs2svn으로 변환해본 결과 대략 25% 이상의 공간이 절약됨
초기 업로드는 원본으로 올리지만, diff 내용들을
gzip으로 압축하므로 서버 공간 요구량이 줄어듦
2009/05/11 - SVN과 CVS 저장소 용량비교(compare Repository Size of CVS & SVN)
4. 커밋마다 revision이 올라감
하나의 변동사항이나, 복수의 파일을 한번에 commit 하면 revision이 변동되고,
프로젝트 전반적인 변동사항을 추적하기 편리함.
cvs는 파일단위 revision이기 때문에 프로젝트 전체의 변동이나
"어떤 파일이 변경되기 이전 시점"으로 롤백하기 매우 난해하나
svn에서는 commit 단위로 revision이 붙으므로, 잘못 commit 하더라도 복구가 용이함
(부가적으로 cvs에 비해서 프로젝트 전반적인 변경의 흐름을 읽기 쉬움)
5. atomic commit
atomic 은 DB에서 하나의 행동의 묶음이 완결되지 않으면 수행되지 않은것으로 복구가 되는 것을 의미하는데
cvs에서 아무생각없이 commit에서 변동사항들을 본다고 하다가 commit 눌러 올려서 도중에 cancel 했지만
몇개는 변경되어 난감한 상황을 겪어봤다면 이 녀석의 유용함을 깨달을 수 있다.
SVN 단점
1. 서버 구성이 괴랄하다
무슨 svn 제대로 쓰려면 apache까지 깔아야 해?
로그를 남기기 위해서는 svn 자체적으로는 로그가 안남으므로 apache의 로그나 인증을 이용해야 함.
관리자 측면에서 로그가 남지않는다는건.. 좀 불안해진다.
(머......
사용자는 서버 관리자의 고충은 알바없지?)
2. tag 관리가 밋밋함
너무 많은 자유는 없는것과 다름 없다지만.. svn의 표준(?) repository는 아래와 같이 구성한다.
2009/05/11 -
SVN repository 구조
개별 프로젝트 별로 trunk / branches / tag를 관리하고
tagging을 위해서 전체 프로젝트를 tag 하위 디렉토리로 tag 번호를 붙여 복사해주면 된다.
어쩌면 매우 간편하지만, cvs의 정말 꼬리표를 붙인다는 작업에 비하면 아쉬운 면이 있다.
cvs에서는 tagging을 하려면 서버와 local의 내용이 동일해야 하고, tagging시 변동 파일이 하나라도 있으면 붙일수 없어
업데이트 되지 않는 파일이 있는지 빼먹지 않을수 있는 여지가 있지만, svn은 서버에서 클라이언트를 보지 않고
작업이 가능해지므로 업데이트 되지 않은(혹은 누구가 그 순간 올린 내용까지) 부분이 빼먹거나 더 들어갈수 있다.
개인 취향이겠지만, tag는 cvs의 약간은 딱딱하고 붙이는 맛이 있는 것이 좋다고 생각한다.
3. repository 구성의 모호함
repository는 위와 같이 구성하려면 svn 사용자는 /calc /paint 두개의 repository를 기억해야 한다.
commit 별로 revision이 증가하는 장점의 역효과로서, 단일 프로젝트레 단일 repository를 보장해주어야 제 힘을 발휘한다.
서로 연관이 있는 두개의 프로젝트라고 하더라도 되도록이면 프로젝트를 분리하는 것이 좋다.
(현재까진 상위 디렉토리의 목록을 (= 프로젝트 목록) 얻어내는 법을 모르겠다.)
/home/svn을 만들고
/home/svn/calc 에 create repository
/home/svn/paint 에 create repository 를 하고
svn에서는 /home/svn/calc , /home/svn/paint가 있음을 외우고 써야한다.
(/home/svn에 접속하면 리파지터리를 알 수 없으므로 에러가 발생한다.)