
언제 한번 분산형 VCS들을 소개하려고 했었는데, krisna님의 요청도 있고 해서 이렇게 글을 한번 써봅니다.
현재 분산형 VCS들은 대략 10여가지 정도가 있는데, 상용으로는 Perforce, Bitkeeper등이 있고, 오픈소스로는 이번에 소개할 Mercurial과, Bazaar, monotone, Darcs, git, SVK 등이 있습니다.
이제 Mercurial에 대해 알아보도록 하겠습니다. 일단 Mercurial은 수은이라는 뜻이죠, 그래서 명령어도 수은의 원소기호인 hg입니다. 아주 Geek한 작명이라 생각합니다.
Mercurial은 분산형 VCS라 CVS나 Subversion 처럼 저장소와 작업 디렉토리(Working Copy)의 구분이 없습니다. 그래서 소스를 수정하여 커밋을 하면 원격에 있는 저장소에 커밋 되는것이 아니라 현재 작업하는 디렉토리에 커밋이 되게 됩니다.
이 커밋을 할때마다 생기는 것이 체인지셋(changeset)인데 Subversion의 리비전 개념과 같이 여러 파일을 동시에 커밋할 수가 있고(atomic commit), 전체 리비전 번호도 붙습니다. 다만 Subversion과 다른 것이 체인지셋마다 고유의 sha1 해쉬값이 붙습니다. 그리고 어느 체인지셋에서 갈라져 나왔는지도 추적이 가능합니다.
중앙집중형 VCS들은 소스를 원격에서 받아올때 체크아웃 명령을 사용하여 받아오지만 Mercurial은 클론(hg clone) 명령을 통해 원격이나 로컬에 있는 저장소를 그대로 복사해옵니다. 그리고 이 복사해온 저장소에 커밋을 하여 작업을 하게 됩니다.
그러면 클론 명령으로 복사해온 저장소에 커밋을 했는데, 원격 저장소에 반영은 어떻게 하냐는 의문점이 생깁니다. 여기서 분산형 VCS의 특징이 나오는데, Mercurial에서는 hg push 명령으로 원격 저장소에 변경된 체인지셋을 밀어 넣습니다. 반대로 원격 저장소에서 변경된 체인지셋을 받아오려면 hg pull 명령으로 가져옵니다. 특정 리비전을 가져오려면 hg update 명령을 이용하면 됩니다
Mercurial의 특징 중 하나가 hg serve 명령을 이용하면 자체 웹서버가 실행되면서 ViewVC 같은 웹 인터페이스를 바로 볼 수 있다는 것입니다. 이렇게 동작시킨 서버를 통해 원격에서 hg clone 명령을 이용하여 저장소를 가져갈 수 있습니다.
현재 Subversion의 단점들
이라는 글에서 Subversion의 단점인 벤더 브랜치 문제를 들었는데, Mercurial 같은 분산형 VCS에서는 저장소를 통째로 클론해오기 때문에 로그와 변경사항도 그대로 남아있고, 그 저장소 안에서 개인적으로 수정사항이 계속 추가될 수 있다는 것입니다.
이라는 글에서 Subversion의 단점인 벤더 브랜치 문제를 들었는데, Mercurial 같은 분산형 VCS에서는 저장소를 통째로 클론해오기 때문에 로그와 변경사항도 그대로 남아있고, 그 저장소 안에서 개인적으로 수정사항이 계속 추가될 수 있다는 것입니다.
-- pyrasis 2007 01-27

) 매일 나이틀리 빌드까지 만들어가면서 배포를 하고 있으니, 의혹(?)은 더욱 증폭됩니다.
누군가 동일한 방식으로 오픈소스 프로그램을 공개하거나 더 싼 가격으로 팔 수 있겠지요. 그렇게 하기 전까지는 그만큼의 노력의 대가를 요구하는 것은 정당하다고 생각이 드네요. -- hey 2007 01-25