VCS(Version Control Systems)는 말 그대로 버전 관리를 위한 시스템을 말한다. 보통 소스 코드의 버전 관리가 주를 이루겠지만, 그외에도 개발에 소요된 문서, 이미지, 각종 바이너리 파일, 이슈 등 모든 주변 리소스가 버전 관리 대상이 될 수 있다.(아니, 그러해야 한다.) 버전 관리는 비록 사용하는 사람의 각별한 노력이 필요하겠지만 개발 리소스가 자라온 이력을 고스란히 담을 수 있다는 점에서 불의의 사고(소스 폴더 Shift-DEL 또는 rm -rf .)나 오판과 모험으로부터 개발자의 육신뿐 아니라 영혼(?)까지도 지켜줄 수 있는 타임머신이다. 그러므로, 하다 못해 'Hello, World!'를 출력해주는 단 한 줄짜리 코드를 작성할 때도 버전 관리는 필요하다.
개인적으로는 RCS -> CVS -> Subversion -> Mercurial/Bazaar-VCS/Git 순으로, 업무용으로는 과거에 주로 Subversion과 Perforce를 사용해왔고 현재는 Git를 사용하고 있는데, 경험에 기초해 간단하게 구분해보면 대략 아래와 같다. 좀 더 전문적이고 상세한 자료를 원한다면 Wikipedia:Revision_control 페이지를 참고하시라.
선조님들!!
써본 지 너무 오래 되어 이제 기억도 잘 나지 않는다. 파일 단위로 리비전을 관리한다는 것 외에 딱히 기억나는 특징이 없음. (그 이상의 용도로 써보지 않았기 때문)
CVS는 RCS의 직계 자손 정도로 볼 수 있고 기능면에서도 분명 차이가 있지만 함께 1 세대로 묶은 건 거의 동시에 사용해보았기 때문이다. 파일 시스템 혹은 네트워크 서버에 중앙 저장소를 두고 클라이언트-서버 구조를 이루어 여러 명이 동시에 협업할 수 있는 버전 관리 시스템으로, lock 기반이 아닌 merge 기반 VCS 중 하나이다. 역사적으로 상당히 오래된 버전 관리 시스템이지만 여전히 많은 곳에서 사용 중인데, Emacs 모듈 SLIME이 그 중 하나다.
공식 홈페이지: http://www.nongnu.org/cvs/
CVSNT: CVS에서 떨어져 나와 초기에는 Windows 용으로 개발되기 시작했지만 지금은 Linux와 Mac도 지원하고 있으며 여전히 CVS와 호환이 되고 원조 CVS에 비해 추가된 기능들과 GUI 클라이언트 등을 지원한다.
TortoiseCVS: Windows 탐색기와 연동되는 클라이언트 도구
호스팅 서비스
개인적인 관점에서 2 세대 VCS의 가장 큰 변화는 파일 단위가 아닌 작업 단위(changeset) commit이 가능해졌다는 점이다. 목록에 따로 추가하지는 않았지만 Visual SourceSafe도 잠깐 써보았다. 그러나 생각했던 것보다 더 심각한 수준의 성능과 lock 기반 협업 방식, 지나친 네트워크 종속성 때문에 Subversion과 Perforce에 밀렸음. ClearCase는 가격 대비 효용성 문제로 도입이 중지됨.
Subversion은 CVS의 장점을 그대로 계승하면서 작업 단위 commit을 지원하고 마지막으로 업데이트한 소스 코드의 원본을 별도로 유지하고 있기 때문에 중앙 서버에 연결할 필요 없이 작업 중인 코드의 달라진 점을 비교할 수 있어 무척 편리하다. 그러나, 버전 관리되는 폴더마다 .svn 하위 폴더를 두는 방식이라 파일이 수만에서 수십만 개되는 대형 프로젝트를 다루게 되면 최종 업데이트의 사본과 각종 버전 정보 파일들이 더해져 그 규모가 어마어마하게 변해버리기 때문에 심각한 성능 문제를 가져왔다. Apache Web Server 기반 서버를 구축하는 것도 가능하기 때문에 Mantis Bug Tracker나 Trac 등과 연동하여 팀내 중소규모 프로젝트를 위해 자주 사용했다.
공식 홈페이지: http://subversion.apache.org/ (원래 위치는 http://subversion.tigris.org/ 였지만, 이후 Apache로 옮김)
TortoiseSVN: Windows 탐색기와 연동되는 클라이언트 도구. 탐색기와 연동되는 것이 매우 편리하기는 하지만, 버전 관리되고 있는 소스 트리의 규모가 커질수록 탐색기에서 심각한 성능 저하를 겪게 된다. 이럴 때는 아이콘 오버레이 기능을 꺼두는 것이 좋다.
호스팅 서비스
Savannah - http://savannah.gnu.org/ / http://savannah.nongnu.org/
XP-Dev: 무료로 비공개 개인 저장소를 2 개까지 사용할 수 있는 서비스.
Subversion과 마찬가지로 중앙집중식 클라이언트-서버 모델로 구성된 버전 관리 시스템이다. 그러나, 버전 관리에 대한 최소한의 정보(정말 최소한이다. 서버에 연결하기 위한 몇 가지 설정 정보만 있으면 된다.)만 클라이언트에 유지할 뿐 나머지 모든 정보는 서버에 존재한다. 결국 서버에 부하가 집중되는 형태로 보이지만, 반대로 생각하면 클라이언트의 부담을 최소화하기 때문에 서버 성능이 충분하고 네트워크 환경이 좋다면 개발자 입장에서는 매우 쾌적한 버전 관리 도구이다. 실제로 지금 껏 경험해본 여러 VCS 중 가장 빨랐다. 대신, 네트워크에 문제가 생기면 모든 서비스 사용불가. Subversion과 다른 점 또 하나는 기본적으로 lock 기반이라는 점. 물론 동시 작업이 아예 불가능한 것은 아니고 적절한 수준에서 자동 merge도 지원한다. 화려하고 편리한 GUI 기반 클라이언트를 제공하는 것이 장점인데, 클라이언트 도구는 무료이고, 서버 도구는 지원 가능한 클라이언트 수에 비례하여 라이센스를 구매하는 상용 프로그램이다.
가장 인상 깊었던 것은 Label 기능. Perforce가 commit 단위인 changelist(changeset과 동일한 개념)와 함께 개별 파일의 revision 정보도 별도로 가지고 있기 때문에 특정 revision의 특정 파일들을 선별적으로 모아 목록으로 만드는 것이 가능하다. 이것이 바로 Label인데, 주로 어느 시점 이후의 commit 내용 중 일부를 배제하거나 몇 가지만 골라서 적용한 소스가 필요할 때 요긴하게 써먹을 수 있는 수단이다. 예를 들어, 제품의 특정 버전 출시 계획에 대해 '3월 28일 13시에 commit된 101234번 changelist를 기본으로 하는데, 101240과 101245 changelist는 포함해야 합니다.' 라는 요구 사항을 반영한 소스 묶음을 만들어낼 수 있다는 것이다.
여기로 넘어오면서 발생한 가장 큰 변화는 분산(distributed)이라는 키워드가 붙었다는 것이다. 중앙집중식 저장소에서 분산 저장소 형배로 바뀐 것인데, 혼자 고립된 상태에서도 이전 commit 내용에 대해 이력 조회와 commit이 가능하다는 점에서 획기적이라고 할 수 있다. 이러한 특징은 branching과 merging이 활발하게 일어날 수 있는 오픈 소스에서 특히 그 빛을 발하고 있고, 사고나 악의적인 행위에 의한 개발 리소스의 완전 소멸 또는 소실에 대해 훨씬 견고한 버전 관리 체계를 구축할 수 있게 해주었다.
Python 기반으로 개발되었기 때문에 Windows, Linux, MacOSX, Solaris 등 다양한 OS 환경을 지원하고 있으며 여러 DVCS 중에서 Git과 함께 비교적 사용 빈도가 높은 편이다.
공식 홈페이지: http://mercurial.selenic.com/
TortoiseHG: Windows 탐색기 연동 클라이언트
호스팅 서비스
BitBucket: 비공개 무료 저장소(구성원을 5 명으로 제한)를 무제한으로 만들 수 있기 때문에 개인적인 소규모 프로젝트나 리소스를 호스팅하기에도 적절하다. 오픈 소스 프로젝트에 대해서는 구성원 제한이 없다.
Source Forge: DVCS가 크게 유행하면서 Source Forge에서도 beta 서비스 형태로 Mercurial과 Git을 지원하기 시작함
Savannah - http://savannah.gnu.org/ / http://savannah.nongnu.org/
나의 오픈 소스 프로젝트
lotto-check - Emacs에서 나눔로또 정보를 확인하고 당첨 여부를 확인할 수 있는 모듈
Mercurial 관련 팁
Encoding 및 HTTP 인증 관련 팁 - Kaisyu's Notes
Bazaar는 DVCS에 대해 관심을 가지기 시작한 초기부터 Mercurial과 함께 줄곧 비교 대상(역시 Python 기반으로 개발되었고 다양한 OS 환경을 지원함)이 되어 왔으나 전체적인 사용 빈도에서 Mercurial보다는 조금 못하다. 성능 비교에서도 Mercurial이 조금 더 나은 면을 보여주고 있지만 QT 기반의 편리한 클라이언트 도구는 매우 쓸만하다. Subversion과 유사한 중앙집중식 저장소 형태도 지원하는 것이 특징. 근래에는 Emacs 개발 소스를 받기 위해 주로 사용하고 있다.
공식 홈페이지: http://bazaar-vcs.org
호스팅 서비스
리누스가 Linux Kernel의 버전 관리를 위해 개발한 DVCS로 여러 오픈 소스 프로젝트에서 활발하게 이용되고 있다. Mercurial과 Bazaar가 하나의 실행 명령에 옵션을 주는 식인 반면 Git은 역할 별로 여러 개의 작은 실행 명령으로 나누어져 있다.
홈페이지: http://git-scm.com/
eBook
Pro Git
공식 사이트: http://git-scm.com/book
한국어 번역본: http://git-scm.com/book/ko
Windows 용 단독 설치본: https://git-scm.com/download/win
Cygwin에 포함된 Git를 사용하는 방법도 있다.
GUI Front-end: http://git-scm.com/download/guis
Source Tree: JIRA, Confluence, BitBucket 등으로 유명한 Atlassian에서 배포하는 .NET Framework로 만들어진 Windows 및 Mac용 무료 GUI 클라이언트 도구. Git과 Mercurial을 지원하며 깔끔한 UI와 다양한 기능을 제공한다.
GitEye: CollabNet.에서 만든 무료 Git GUI 클라이언트 도구(무료로 사용하기 위해서는 CloudForge에 계정 등록해야 함). Eclipse 기반이라 Windows, Linux, Mac 등 다중 플랫폼을 지원하고 Issue Tracker 연동, Gerrit 코드 리뷰, Agile 태스크 보드, Hudson/Jenkins 빌드 모니터링 등 강력한 기능들을 제공한다. 하지만, Eclipse답게 상대적으로 큰 설치 용량과 높은 메모리 점유율은 피할 수 없는 단점.
TortoiseGit: Windows 탐색기와 연동되는 GUI 클라이언트 도구(이 Tortoise 시리즈는 좀 유명하다 싶은 VCS에는 다 있다.)
호스팅 서비스
github - Git을 사용한 대표적인 소스 저장소 호스팅 서비스. 오픈 소스에 대해서는 무료 서비스 제공
Bitbucket - JIRA로 유명한 Atlassian에서 운영하는 서비스로 Git과 Mercurial repository 서비스를 제공하며, private code repository를 무료로 제공하는 것이 특징(5명 제한)
GitLab - 설치형 Git Repository + Issue Tracker 소프트웨어 오픈 소스 프로젝트의 이름이자 무료 호스팅 서비스의 이름이기도 함. 호스팅 서비스의 경우 현재는 무료로 무제한 private code repository를 만들어 사용할 수 있음. 다만 성능 상의 이유로 repository 당 1 GB의 크기 제한이 있음. 자세한 내용은 https://about.gitlab.com/gitlab-com/ 참고
CloudForge - CollabNet.에서 운영하는 서비스. Git과 Subversion 지원. 1인 개인 프로젝트에 한 해 무제한 private repository 제공되며 팀 단위 프로젝트를 진행하려면 유료 서비스를 구매해야 함.
Source Forge - DVCS가 크게 유행하면서 Source Forge에서도 beta 서비스 형태로 Mercurial과 Git을 지원하기 시작함
Savannah - http://savannah.gnu.org/ / http://savannah.nongnu.org/
나의 오픈 소스 프로젝트
lotto-check - Lotto 645 당첨 번호 정보를 열람하거나 비교할 수 있는 간단한 emacs mode
pidgin-nateon - Pidgin 메신저에서 네이트온 프로토콜을 사용하기 위한 플러그인. HazE 님이 최초로 개발하고 difro 님, forcecore 님 등 여러 사람의 패치가 더해짐. 이 저장소는 difro 님의 저장소로부터 fork된 것임.
Git-flow (Branching Model)
Release, Develop, Feature, Hotfix, Support 등으로 목적에 따라 branch를 나누어 체계적으로 관리할 수 있는 모델
A Successful Git Branching Model: http://nvie.com/posts/a-successful-git-branching-model/
Git-flow(github): https://github.com/nvie/gitflow
정보통신산업진흥원 소프트웨어공학센터에서 Git-flow에 대해 소개한 웹진 문서
그다지 자주 사용하지는 않지만 Bug Tracking, Wiki, Web Interface 등이 단일 실행 파일 안에 응축되어 있는 일체형 VCS 겸 프로젝트 관리 시스템이라는 특징 때문에 나름 관심을 가지고 지켜보고 있다. Windows, Linux, MacOSX, OpenBSD 등 다양한 OS 환경을 지원하고 저장소를 위한 backend로 SQLite DB를 사용하는데 대규모 프로젝트에 아직 적용해본 적은 없어서 성능이 어느 정도인지는 모르겠음. 실행 파일 달랑 하나로 되어 있기 때문에 설치(사실 설치라고 말할 것도 없지만)가 무척 간편하고 더불어 이동성 또한 매우 뛰어나다. 소규모 개인 프로젝트를 관리하기에 꽤 좋은 도구라고 생각됨.
공식 홈페이지: http://www.fossil-scm.org/
호스팅 서비스