젠투서버와 모든 클라이언트에서의 subversion을 이용한 버전관리 Computer Tip

이미 몇년 전부터 CVS를 이용하여 버전관리를 해 오고 있었다.
챙피하게도 이쪽으로 일을 하기 시작한 지 십년이 넘도록 버전관리를
하지도 않았고 누가 하라고 시키지도 않았다. 나중에 2000년대가 되어서야
비로서 M$의 SourceSafe를 이용하기도 했었다. 하지만 그것은 윈도우 안에서
그것도 Visual Studio와 붙어야만 한다는 태생적인 제약사항이 있었다.
(어디까지나 M$는 좋아라 정책적으로 그렇게 만들었을 것이다)
그러다가 시작한 CVS를 잘 사용하고 있었다. 그러다가 최근에 몇가지
불편한 상황들이 발생했다.

1) CVS에서 각 파일들은 rename이 되지 않는다. 이전것을 다른이름으로 복사했다가
삭제하고 다른이름으로 추가하고 커밋하는 등의 작업을 수동으로 해야 한다.
(물론 그놈 프로젝트나 소스포쥐와 같은 곳에서 CVS를 하니까 따라서 한다고
고집을 부린다면 뭐 할말없다)
2) 위에서의 파일의 rename은 불구하고 디렉터리 rename은 더욱 황당한 경우이다.
이를 서브버전은 자동으로 위에서 수동으로 했던 작업을 금방 해 준다.
3) 거북이CVS(TortoiseCVS)라는 윈도우 탐색기에 붙어서 작업하는 gui 프로그램에서
commit을 하는데 자꾸 충돌이 일어나서 자꾸만 수동으로 작업을 하게 만들었다.

이런 불편함 때문에 대안을 찾고 있다가, 바로 SubVersion이라는 것이 정답이라는 것을
알게 되었다. 위의 불편함외에 다음과 같은 이득을 얻고자 subversion(SVN이라고 하자)이
CVS 코드레벨부터 출발했다 한다. (물론 자세한 것은 구글아저씨께 물어보시고~~ ^^)

1) cvs와 달리 rename이라는 기능이 있어 무척 편리하다.
2) 디폴트로 버클리DB 저장소 색인기능을 사용하기 때문에 CVS에 비해 무척빠르다.
3) 백업 등의 기능이 CVS에 비해 좋다.
4) CVS와 같이 사설 프로토콜 (SVN) 뿐만 아니라 SSH를 이용한 연결(svn+ssh), 그리고
HTTP를 이용한 연결도 쉽게 가능하다. 특히 아파치 모듈로 기능을 지원하므로
속도도 아주 빠르다. 어떻게 연결하던지 간에, URL방식으로 쉽게 접속가능하다.
5) 디렉터리도 각각 독립적으로 버전관리가 된다.
6) MIME형식으로 이진파일을 판별하며, 자동 이진파일 판별 능력이 뛰어나다.
7) CVS와는 달리 WIN32용 전용 서버도 존재한다.
8) 거북이CVS 보다 약간 더 좋은 기능의 거북이SVN 클라이언트가 존재한다.

기타 여러가지가 많이 있지만, 지금까지 사용한 바로는 여기까지만...

우선 젠투서버에 subversion을 설치해 보기로 했다.
# emerge -av subversion
명령으로 쉽게 설치가 된다. 기존에 CVS가 설치되어 있어도 상관없다.

위와 같이 정상적으로 서브버전이 설치되었다면 그 다음은 저장소를 위한 디렉터리를 하나 만든다.

# mkdir /home/svn
# chown -R svn:users /home/svn
(svn uid와 users gid를 사용한다고 가정한다)

그 다음에는 필요에 따라 저장소를 하나씩 만든다.
# cd /home/svn
# svnadmin create sample

위에서 생성하는 저장소는 CVS에서의 독립된 모듈이라고 생각해도 무방하다.
위에서와 같이 생성한 다음에는 버전관리를 위한 모든 사용자가
users라는 gid를 사용한다고 가정하고, 다음과 같은 명령으로

# cd /home/svn
# chmod -R g+w sample

이라고 users그룹도 쓰기가 가능하도록 만든다.

그 다음 이해가 쉽도록, 윈도우에서 올려보고 받기위해서 TortoiseSVN을 다운로드하여 설치한다.
설치하고 나서 탐색기에 보면 아래 그림과 같이 설치되어있음을 알 수 있다.
(개인적인 생각인데 설치버전도 2.5배정도 크기가 크고 8M정도, 완성도도
거북이CVS에 비하여 더 좋은 듯한 느낌이다)



위에서는 이미 common이라는 저장소완 연결되어 있기 때문에 이렇게 나온것이고, 처음에는 무언가 빈 디렉터리라도 만들고
그것을 위의 sample 저장소에 import하면 된다.

우선 import하기 전에 ignore를 지정한다. 다음과 같이 설정을 눌러,



중요!!!

*.o *.tmp obj *.~* bin *.obj RECYCLER bin *.user *.suo *.dcu *.rsm Thumbs.db *ebug *elease *.FileList.txt *.ncb *.old *.sbr *.pch .* *.class

이런 식으로 global ignore를 설정한다.



이렇게 해야 원하지 않는 파일이 버전관리에 들어가지 않도록 할 수 있다.
물론 위의 저장소 안에서도 직접 지정할 수 있는데,
저장소 안에 conf/svnserve.conf 라는 파일을 열어
global-ignores=*.o *.lo *.la .* *.rej *.rej .*~ *~
라는 내용을 마지막에 추가하면 된다.

이제 import를 하기 위해 임시 디렉터리에
"헬로월드"를 만들고 그 아래에 각각 "기타","문서","소스" 라는 세개의 서브 디렉터리를 만든다음
탐색기에서 헬로월드가 보이도록 한 상태에서 TortoiseSvn의 import 명령을 눌러 다음과 같이
url을 지정한다.



아래의 url에서는 svn+ssh 프로토콜을 사용한다는 의미이고,
사용자 mcchae, 서버는 putty의 svn 설정, 저장소 위치는 /home/svn/sample 임을 의미한다.
Putty의 Pagent가 인증서를 물고 있어야 암호를 물어보지 않는다.


OK를 눌러 Import 시킨다.

이제 이 임시파일은 없어져도 되고, work/sample 이라는 디렉터리를 만들어
sample 저장소에 만들어진 내용을 checkout 해 보기로 한다.



아래와 같이 URL을 지정한다.



이제 로컬에서 헬드월드/문서/Readme.txt를 새로 만들고 이를 추가해본다.



왼쪽 문서에 보면 체크 표시가 SVN으로 버전관리 되어 있음을 알 수 있고 (체크는 저장소와 일치되었음을 타나냄)
그것에 따라 오른쪽에 Add 명령을 줄 수 있다. 혹시 해당 파일은 저장소에 넣지 말기를 원한다면 아래의
"Add to ignore list"로 property:ignore에 추가한다.



그러면 위와 같이 물어보고, 바로 OK를 해서,



이제 저장소에 바로 들어간 것이 아니다. 그런파일이 들어가려고 준비하고 있습니다.
(물음표로 무언가 저장소와 변경되었음을 알 수 있다)
버전관리를 처음 사용하면 이런 방식이 어려울 수도 있지만, 적응하면 괜찮다.



여러사람들이 동시에 진행하는 프로젝트가 많으므로, 버전관리를 위한 일정 메시지
방법을 정하여 메시지를 지정하도록 한다.
나중에 히스토리 등을 볼때 아주 유용하다. 또한 TRAC 라는 위키랑 붙으면
자동으로 수정된 목록을 보여주기도 한다. (본 글의 범위를 벗어남)



커밋을 하고 나서는 느낌표가 체크로 바뀐다.
자동으로 바뀌지 않고 F5로 refresh를 해야만 보이는데 이것은 다음버전에서 제대로 표시해 주었으면 한다.
(아니면 디렉터리의 재귀적 표시 때문에 힘들어서 그렇게 할 수도 있고)
거북이CVS에 비하여 명령도 많고 아이콘 옆의 작은 표시도 recursive로 더 정교하게 표현된다.

갱신은 새로 추가에 유사하게 저장소의 내용과 달라지면 자동으로 변경되었다고 나오니,
소스 같은 경우, 수정한 다음 테스트 및 수정이 완료되면 바뀐내용을 한꺼번에 커밋하면 된다.

S/W나 H/W 관련 프로젝트를 진행하는 팀 뿐만 아니라, 컴퓨터 문서를 다루는 거의 모든 곳에서
버전관리를 하고 안하고는 아주 큰 차잇점이 있다.
조엘온소프트웨어 라는 책에서도 언급되어 있듯이 버전관리를 안하는 SW 회사는
주먹구구 식으로 어떻게 개발해야 하는지 정책도 방향도 없는 회사일 경우가 높다.

지금 이 시간에도, 혹시라도 버전관리를 안하고 있는 회사, 팀, 개인, 동료가 있다면
CVS나 서브버전 또는 소스세이프 등등 어떤 버전관리 시스템이라도 도입하여
사용하기 바란다.

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://mcchae.egloos.com/tb/5204073 [도움말]

핑백

덧글

덧글 입력 영역