Subversion 서브버전 배워보기

2:28 PM

언제나 그렇듯이 새로운 툴을 배우고 사용한다는 건 긴장되고 설레인다. 아마 나이가 하나 둘 더 먹어가면서 긴장되는 쪽에 더 가까워 지는 건 어쩔 수 없는 모양이다.

어째든 그동안 정들었던 Microsoft Visual SourceSafe (MS VSS)를 버리고 Subversion 으로 갈아 탈 때가 된 것 같아, 간단히 SVN에 대하여 정리를 해 보기로 하자.

Subverion (SVN)은 2000년 CollabNet Inc 에 의해서 시작된 버전관리시스템이다. CVS나 Visual Sourcesafe를 사용해 본적이 있는 사용자들은 쉽게 어떤 소프트웨어인지 감이 잡힐 것이다. 다시 말하면 소스코드나 문서의 변경사항을 기록, 관리 할 수 있도록 해주는 시스템이다.

SVN은 오픈소스 진영에서 널리 사용되고 있는데 Apache Software Foundation, KDE, GNOME, FreeBSD, Python, Ruby 등등이 대표적인 예이다.

현재 SourceForge.net과 Tigris.org 에서 오픈 소스 프로젝트를 위한 Subversion 호스팅을 지원하고 있다.

Subversion은 Apache License 에 따라 배포되고 있으며 무료로 사용할 수 있다.


>Layers

Subversion은 내부적으로 몇가지 계층으로 나눠진 라이브러리들로 구성되어 있다 (사실 안 그런 시스템이 있으라만은). 각각의 계층은 아래와 같이 특정한 업무를 수행한다.

  • Fs: 가장 최하위 계층으로 사용자의 데이타(소스코드나 문서)의 저장을 담당하는 파일시스템이다.
  • Repos: Fs 위에 구축된 저장소 (repository). Fs 와 Repos가 FileSyste Interface를 구성한다.
  • mod_dav_svn: Apache 2를 통한 WebDAV/Delta-V를 지원한다.
    • 참고로 WebDAV는 Web-based Distributed Authoring and Versioning 의 약자로 여러 사용자가 웹상에서 떨어져 있는 컴퓨터의 파일을 같이 편집, 관리할 수 있도록 고안된 HTTP 프로토콜의 확장판이라고 보면된다. Delta-V는 이 WebDAV의 확장으로 파일의 변경내력을 관리하는 기능이 추가된 프로토콜이다.
  • Ra: Repository Access. 리소스에 대한 로컬 또는 리모트(원격) 접근을 관리한다. 이 layer를 통하여 저장소는 URLs형태로 접근 가능하게 된다. 예를 들면 file:///path/ 를 통한 로컬 접근, http://host/path 또는 svn://host/path 은 원격 접근 URL 형식이다.
  • Client, WC: 가장 최상위 레벨로. 저장소에 대한 접근과 SVN 사용자에 대한 서비스를 담당한다. 예를들면, 사용자 인증, 버전 비교 등등.
>FileSystem

Image:Svn 3D-tree.svg
Repository에 바로 소스를 넣어 프로젝트를 진행할 수 있지만, 권장되는 디렉토리 배치방법이 있습니다. 위에 보이는 구조와 같이, Repository 아래 branches, tags, trunk 라는 3개의 디렉토리가 있습니다. 이 디렉토리는 각각의 용도가 있는데, CVS는 branch와 tag를 위한 명령이 따로 존재하지만, Subversion의 경우 명령은 있지만 단순히 디렉토리 복사와 같은 효과를 냅니다.
  • trunk: 프로젝트의 가장 중심이 되는 디렉토리입니다. 참고로 trunk의 단어뜻은 여행용 가방이 아니라 :-) 식물의 줄기, 동물의 몸통을 뜻한다. 단어뜻에서 감이 오다시피 모든 프로젝트 작업은 이 trunk 디렉토리에서 이루어지게 된다. 다시 말하면 trunk 디렉토리 아래에 소스파일과 디렉토리가 들어가게 된다.
  • branches: 나무가지. 개발자들이 반길 일은 아니지만 프로그램을 개발하다 보면 소스를 분기하여 따로 개발할 필요가 생긴다. 일종의 프로젝트안의 프로젝트라고 생각하면 된다. branches 디렉토리 안에 또 다른 디렉토리를 두어 그 안에서 개발하게 된다.
  • tags: 꼬리표. 이 디렉토리는 프로그램을 개발하면서 정기적으로 릴리즈를 할 때 1.0, 2.5, 3.0 하는 식으로 버전 번호를 붙이게 되는데 그때 발표한 소스를 따로 저장하는 디렉토리이다.
>CVS vs. Subversion
  • Commit 단위가 파일이 아니라 체인지셋이다. CVS는 여러개의 파일을 한꺼번에 commit하더라도 각각 파일마다 Revision이 따로 붙었다. 반면 Subversion은 파일별 revision이 없고 한 번 commit할 때마다 변경사항별로 revision 번호가 증가한다.
  • CVS에 비해 속도가 빠른 Updating, Branching, Tagging
  • CVS와 사용법이 같다.
  • 파일 이름변경, 이동, 디렉토리 버전 관리도 지원
  • Atomic commit 지원. Subversion은 여러개의 파일을 commit할때 실패 시 모두 이전 상태로 되돌린다.
  • 트리별, 파일별 접근 제어 리스트 ACL. Repository 쓰기 접근 권한을 가진 개발자라도 아무 소스나 수정하지 못하게 조절할 수 있다.
  • Repository/프로젝트별 환경 설정 가능
>Branching and Tagging
Image:Subversion project visualization.svg
Subversion은 Perforce사의 Interfile Branching Model을 사용하여 branches 와 tags 기능이 지원한다.
Branching 은 어떤 독립된 개발 프로젝트에 대한 소스변경을 기존 프로젝트 소스코드에 영향을 주지 않고 분리하여 작업할 수 있게 해준다.
Tagging은 추가 적인 정보를 설정할 수 있게 해주는 기능이다.

새 Branch 또는 tag 는 'svn copy' 명령어에 의해서 생성되는데, Subversion은 전체 소스를 모두 복사해서 만들지 않는다. 대신 예전버전과 새버전은 서로 내부적으로 연결(link)되어 있고, 변경 내력도 서로 공유한다. 따라서 새로운 Branch 또는 tag라도 실제 사이즈는 크지 않게 되는데 이는 Subversion이 단지 변경된 부분만을 저장하기 때문이다.

각각 branch의 모든 파일은 복사가 이뤄질때까지의 소스 변경 내력도 같이 갖게 되는데. branch 이후 변경 사항은 향후 다시 trunk 나 다른 branch들에 반영할 수 있다.

Subversion에서 branches와 tags의 차이는 소스 코드 변경사항이 tags에는 반영될 수 없다는 점이다.

0 comments: