변경된 코드를 식별하고 추적하는 작업은 다수의 개발자들에 의해 수행되며, 이러한 코드를 하나의 최신 코드 베이스로 병합하면 협업적인 다중 개발자 프로젝트가 가능해진다. VCS 소프트웨어는 RCS(Revision Control System) 또는 SCM(Source Code Managment) 시스템이라고도 하며, 이 소프트웨어를 이용하면 다수의 사용자가 동일한 파일이나 프로젝트를 변경할 수 있어서 어떤 개발자가 다른 개발자가 변경한 코드를 우연히 겹쳐 쓸 수 없게 된다.
Linux®와 UNIX® 시스템에는 RCS 및 CVS(Concurrent Versions System)와 같은 구형 시스템으로부터 Arch, Bazaar, Git, Subversion 및 Mercurial과 같은 최신 시스템에 이르기까지 다양한 VCS 시스템이 있다. Git와 달리 Mercurial은 처음에는 Linux 커널의 소스 코드를 유지보수하고 관리하는 데 사용된 BitKeeper라고 하는 상용 소스 코드 관리 시스템을 대체하는 오픈 소스였다. 그 이후에 Mercurial은 많은 오픈 소스 및 상용 프로젝트에서 사용되는 인기 있는 VCS 시스템으로 발전되었다. Mercurial을 사용하는 프로젝트로는 Mozilla, IcedTea 및 MoinMoin wiki가 있다. 이러한 사례를 포함한 더 자세한 내용을 확인할 수 있는 링크는 참고자료를 확인한다.
일반적으로 VCS 시스템은 변경할 수 있고 추적할 수 있는 각 소스 코드 콜렉션을 저장소로 참조한다. 중앙화된 VCS 시스템인 CVS 및 Subversion과 같은 전통적인 VCS 시스템과 분산 VCS 시스템인 Mercurial 및 Git와 같은 더 유연한 VCS 시스템 간의 중요한 차이점은 개발자가 저장소와 상호 작용하는 방식에 있다. 개발자는 클라이언트/서버 모델을 사용하여 중앙화된 VCS 시스템과 상호 작용한다. 이런 경우에는 소스 코드 로컬 사본의 변경된 코드가 중앙 저장소에만 다시 삽입된다. 개발자는 피어 투 피어 모델을 사용하여 분산 VCS 시스템과 상호 작용하며 이런 경우에는 중앙 저장소에 있는 모든 사본이 변경될 수 있고 다른 사본과 함께 공유될 수 있는 저장소가 된다. 사실상 분산 VCS 시스템에는 중앙의 마스터 저장소라는 개념이 없지만, 해당 소프트웨어의 마스터 버전을 빌드하고, 테스트 및 유지보수하는 데 필요한 하나의 저장소를 둔다는 정책에 따라 거의 언제나 하나의 마스터 저장소가 정의된다.
Mercurial은 시작하기 쉬운 작지만 강력한 분산 VCS 시스템으로 여전히 VCS 전문 사용자가 사용하는 데 필요한 고급 명령을 제공한다. Mercurial의 분산 특성을 이용하면 로컬에서 프로젝트를 쉽게 작업할 수 있을 뿐만 아니라 로컬 커미트를 통해 변경된 코드를 추적하고 관리할 수 있으며 이러한 변경 코드를 필요할 때마다 원격 저장소에 저장할 수 있다.
최신 분산 VCS 시스템 중에서 Mercurial과 가장 근접한 VCS 시스템은 Git이다. Mercurial과 Git의 차이점은 다음과 같다.
-
내장된 다수의 실행 취소 조작: Mercurial의
revert,backout및rollback명령을 이용하면 특정 파일의 이전 버전이나 커미트된 이전의 변경 세트를 쉽게 되돌릴 수 있다. Git에는 일반적으로 이해하기 어려운 구문을 사용하는 하나의 내장revert명령이 있다. - 내장 웹 서버: Mercurial은 간단한 통합 웹 서버를 제공하며 이 웹 서버를 이용하면 다른 개발자가 가져오기 작업을 수행할 저장소를 신속하게 호스트할 수 있다. 밀어넣기 동작을 수행하려면 보안을 무시하거나 SSL(Secure Sockets Layer)을 지원하도록 더 복잡하게 설정해야 한다.
-
복사 및 이동 조작을 수행하는 동안 히스토리 유지: Mercurial의
copy및move명령은 모두 완전한 히스토리 정보를 유지하는 반면에 Git는 어느 경우에도 히스토리를 유지하지 않는다. - 브랜치: Mercurial은 자동으로 모든 브랜치를 공유하지만, Git는 로컬에서 브랜치를 작성하거나 브랜치를 원격 저장소에 있는 특정 브랜치에 맵핑하여 각 저장소에 자체 브랜치를 설정한다.
- 글로벌 및 로컬 태그: Mercurial은 저장소 간에 글로벌 태그를 지원하며, 이 태그를 이용하면 브랜치를 설정하지 않아도 코드 개발 과정의 특정 시점에 관한 정보를 쉽게 공유할 수 있다.
- Windows 플랫폼에 대한 기본적인 지원: Mercurial은 Python으로 작성되었으며 Microsoft® Windows® 시스템에서 지원된다. 따라서 Mercurial은 Windows 실행 파일로 사용 가능하다(참고자료 참조). Windows에서 Git를 사용하는 방법은 더 복잡하다. msysGit를 사용하거나 Cygwin 하에서 표준 git를 사용하거나 웹 기반 호스팅 시스템과 저장소를 사용할 수 있다.
- 자동 저장소 압축: Git를 사용하는 경우에는 사용자가 저장소를 명시적으로 압축하고 가비지 컬렉터를 작동해야 하지만, Mercurial에서는 이러한 조작이 자동으로 수행된다. 그러나 코드 베이스가 같은 경우에 Mercurial의 저장소는 Git의 저장소보다 더 큰 경향이 있다.
Mercurial과 Git를 선호하는 개발자라면 각 VCS 시스템 명령 세트의 학습 커브와 장점 및 유용성을 살펴보고 싶을 것이다. 그러나 지면 관계상 여기에서는 이러한 내용을 다루지 않는다. 그렇지만 관련 주제를 웹에서 검색하면 흥미로운 읽을 거리를 많이 찾을 수 있다.
Mercurial을 사용하는 경우에는 프로젝트의 소스 코드를 저장할 로컬 저장소를 두 가지 방법으로 작성한다. 저장소를 명시적으로 작성하거나 기존의 원격 저장소를 복제한다.
-
로컬 저장소를 작성하려면,
hg init [REPO-NAME]명령을 사용한다. 이 명령을 실행할 때 저장소의 이름을 제공하면 특정 위치에 이 저장소에 해당하는 디렉토리가 작성된다. 저장소의 이름을 제공하지 않으면 현재의 작업 디렉토리가 저장소가 된다. 후자는 기존의 코드 베이스를 저장할 Mercurial 저장소를 작성하는 경우에 유용하다. -
기존 저장소를 복제하려면,
hg clone REPO-NAME [LOCALNAME]명령을 사용한다. Mercurial은 원격 저장소에 액세스하는 데 필요한 HTTP 및 SSH 프로토콜을 지원한다. 목록 1에는hg명령 예제와 SSH를 통해 저장소를 복제한 결과가 표시되어 있다.
목록 1. SSH를 통해 Mercurial 저장소 복제$ hg clone ssh://codeserver//home/wvh/src/pop3check wvh@codeserver's password: destination directory: pop3check requesting all changes adding changesets adding manifests adding file changes added 1 changesets with 12 changes to 12 files updating to branch default 12 files updated, 0 files merged, 0 files removed, 0 files unresolved remote: 1 changesets found
참고: HTTP 프로토콜을 사용하여 Mercurial 저장소에 액세스하려면 해당 저장소에서 Mercurial의 내부 웹 서버를 시작하거나(hg serve -d), Mercurial의
hgweb.cgi 스크립트를 사용하여 Mercurial과 기존 웹 서버(Apache)를 통합해야 한다. HTTP를 통해 복제를 하는 경우에는 일반적으로 로컬 저장소의 이름을
지정한다.
저장소를 작성하거나 복제하여 해당 저장소를 작업 디렉토리로 구성하면 저장소에 있는 코드를 대상으로 작업을 시작하고 파일을 새로 추가하는 등의 작업을 수행할 수 있다.
Mercurial의 기본 명령은 hg로 다른 VCS 시스템에 있는 명령과 비슷한 하위 명령 세트를 지원한다. 가장 일반적으로 사용되는 명령 목록을 확인하려면
hg 명령을 인수를 사용하지 않고 실행한다. 그러면 목록 2에 있는 것과 비슷한 결과가 표시된다.
목록 2. Mercurial에서 제공하는 기본 명령
Mercurial Distributed SCM
basic commands:
add add the specified files on the next commit
annotate show changeset information by line for each file
clone make a copy of an existing repository
commit commit the specified files or all outstanding changes
diff diff repository (or selected files)
export dump the header and diffs for one or more changesets
forget forget the specified files on the next commit
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge working directory with another revision
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
serve export the repository via HTTP
status show changed files in the working directory
summary summarize working directory state
update update working directory
use "hg help" for the full list of commands or "hg -v" for details
|
이 짧은 목록에는 기본적인 Mercurial 명령만 표시되어 있다. 전체 목록을 확인하려면 hg help 명령을 실행한다.
팁: hg help COMMAND 명령을 실행하면 모든 Mercurial 명령에 대한 자세한 도움말을 확인할 수 있다. 이 명령을 실행할 경우에는 COMMAND를
유효한 Mercurial 명령의 이름으로 바꾸어야 한다.
모든 VCS 시스템에서 가장 일반적으로 수행되는 조작은 변경사항을 확인하는 조작이다. hg status 명령을 사용하여 해당 저장소에 대기 중인
모든 파일 변경 조작을 확인할 수 있다. 예를 들면, 파일을 새로 작성하거나 기존 파일을 수정하면 목록 3과 같은 결과를 확인할 수 있다.
목록 3. Mercurial에서 출력된 상태
$ hg status
M Makefile
? hgrc.example
|
이 경우에는 Makefile이 수정된 기존 파일(해당 행의 시작 부분에 문자 M이 표시됨)이고 hgrc.example 파일은 추적되고 있지 않은 새 파일(해당 행의 시작 부분에 물음표(?)가 표시됨)이다.
hgrc.example 파일을 이 저장소에서 추적되는 파일 목록에 추가하려면 hg add 명령을 사용한다. 둘 이상의 파일 이름을 인수로 지정하면 이러한 파일이
Mercurial에서 추적하는 파일 목록에 명시적으로 추가된다. 파일을 하나도 지정하지 않으면 목록 4와 같이 새로 작성된 파일이 모두 해당 저장소에 추가된다.
목록 4. 저장소에 파일 추가
$ hg add
adding hgrc.example
|
팁: 새로 작성된 모든 파일을 자동으로 추가하고 제거된 모든 파일을 영구 제거로 표시하려면 Mercurial의 유용한 hg addremove 명령을 사용한다.
저장소의 상태를 확인하면 목록 5와 같이 새로 작성된 파일이 추가되었다는 것을 알 수 있다(해당 행의 시작 부분에 문자 A가 표시됨).
목록 5. 수정 후의 저장소 상태
$ hg status
M Makefile
A hgrc.example
|
모든 VCS 시스템에서 가장 일반적으로 수행되는 조작은 변경사항을 확인하는 조작이다. 변경사항을 수행하고 테스트하고 나면 이러한 변경사항을 로컬 저장소에 커미트할 수 있다.
이번이 첫 번째 Mercurial 프로젝트인 경우에는 Mercurial이 이러한 변경사항을 커미트할 사용자를 식별할 수 있도록 몇 가지 기본적인 정보를 제공해야 한다. 이렇게 하지
않으면 변경사항을 커미트하려고 할 때, abort: no username supplied... 메시지가 표시되고 변경사항은 커미트되지 않는다.
사용자 정보를 추가하려면 홈 디렉토리에 .hgrc 파일을 작성한다. 이 파일은 개인용 Mercurial 구성 파일이다. 최소한 목록 6에 있는 기본 사용자 정보를 이 파일에 추가해야 한다.
목록 6. 사용자의 .hgrc 파일에 있는 필수 정보
[ui]
username = Firstname Lastname <user@domain.tld>
|
Firstname과 Lastname을 자신의 이름과 성으로 바꾸고 user@domain.tld를 자신의 이메일 주소로 바꾼 후, 수정된 파일을 저장한다.
모든 사용자에게 적용되는 기본 Mercurial 구성 값(특정 사용자에 해당하는 정보는 제외)을 Linux 및 UNIX 시스템에서는 /etc/mercurial/hgrc에, Microsoft Windows 시스템에서는 Mercurial.ini 파일에 설정할 수 있다. Windows 시스템에서는 Mercurial.ini 파일이 Mercurial 설치 디렉토리에 있다.
~/.hgrc 파일을 작성하거나 확인한 후에는 hg commit 명령을 사용하여 변경사항을 커미트할 수 있고, 커미트할 특정 파일을 식별하거나 다음 예제와 같이
인수를 제공하지 않음으로써 대기 중인 모든 변경사항을 커미트할 수도 있다.
$ hg commit
Makefile
hgrc.example
committed changeset 1:3d7faeb12722
|
이 예제의 결과에 표시된 바와 같이 Mercurial은 단일 커미트와 연관된 모든 변경가상을 changeset으로 참조한다.
변경사항을 커미트하면 사용자가 커미트 메시지를 추가할 수 있게 Mercurial에서 기본 편집기가 시작된다. 이렇게 하지 않으려면 -m "Message.." 옵션을 사용하여
명령행에서 커미트 메시지를 지정한다. 다른 편집기를 사용하려면 ~/.hgrc 파일의 [ui] 섹션에 editor 항목을 추가하고
editor 키워드 다음에 사용할 편집기의 이름과 연관된 모든 명령행 옵션을 삽입한다. 예를 들면, 비윈도우 모드에서 emacs를 기본 편집기로 사용하기 위해
항목을 추가하면 ~/.hgrc 파일이 목록 7과 같은 형태가 된다.
목록 7. 추가로 사용자 정의한 사용자의 .hgrc 파일
[ui]
username = William von Hagen <wvh@vonhagen.org>
editor = emacs -nw
|
팁: Mercurial에서 제공하는 활동 관련 정보의 양을 극대화하려면 Mercurial 구성 파일의 [ui] 섹션에 verbose = True 항목을 추가한다.
원격 저장소의 복제본을 사용할 경우에는 해당 변경사항을 로컬 저장소에 커미트하고 나서 다시 원격 저장소에 밀어 넣는다. 이렇게 하려면 목록 8과 같이 hg push 명령을 사용한다.
목록 8. SSH를 통해 변경사항 밀어넣기
$ hg push
wvh@codeserver's password:
pushing to ssh://codeserver//home/wvh/src/pop3check
searching for changes
1 changesets found
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 2 changes to 2 files
|
독자가 원격 저장소의 복제본을 사용 중이고 다른 사용자도 동일한 저장소를 사용 중인 경우에는 다른 사용자가 수행하여 이 저장소에 밀어 넣은 변경사항을
검색할 수 있다. 이렇게 하려면 목록 9와 같이 Mercurial의 hg pull 명령을 사용한다.
목록 9. SSH를 통해 변경 풀링
$ hg pull
wvh@codeserver's password:
pulling from ssh://codeserver//home/wvh/src/pop3check
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 0 changes to 0 files
(run 'hg update' to get a working copy)
remote: 1 changesets found
|
이 명령의 결과에 표시되어 있듯이 이 명령은 원격 저장소에 있는 변경사항에 관한 정보만 검색하므로 hg update 명령을 실행하여 로컬 저장소에 있는 연관된 변경사항을
확인해야 한다. 목록 10에 표시된 바와 같이 이 명령은 저장소가 업데이트된 방식을 식별한다.
목록 10. 저장소를 업데이트하여 변경사항 표시
$ hg update
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
Mercurial은 커미트된 변경사항을 쉽게 취소할 수 있는 다음과 같은 내장 명령을 제공한다.
-
hg backout CHANGESET: 특정 변경 세트를 실행 취소하고 이 변경 세트를 실행 취소하는 변경 세트를 작성한다. 이 명령을 실행할 때--merge옵션을 지정하지 않는 경우에는 변경 세트를 현재의 변경내용에 병합하여 다시 원격 저장소에 밀어 넣어야 한다. -
hg revert: 이름을 지정하여 둘 이상의 파일을 이전 버전으로 되돌리거나--all명령행 옵션을 지정하여 모든 파일을 이전 버전으로 되돌린다. -
hg rollback: 마지막 Mercurial 트랜잭션을 실행 취소한다. 이러한 트랜잭션은 일반적으로커미트, 원격 저장소로부터가져오기또는 원격 저장소에밀어넣기를 수행하는 트랜잭션이다. 사용자는 트랜잭션 하나만 실행 취소할 수 있다.
명령을 사용하기 전에 이러한 모든 명령의 온라인 도움말을 참조하자.
앞으로는 Mercurial과 같은 분산 소스 코드 관리 시스템이 많이 사용될 것이다. Mercurial은 오픈 소스 소프트웨어이며 Linux, UNIX, Microsoft Windows 및 Mac OS® X 시스템에서 Mercurial의 사전 컴파일된 버전을 사용할 수 있다. 이 기사에서는 Mercurial을 사용하여 많은 공통 VCS 태스크를 수행하는 방법을 강조하면서 Mercurial을 사용하는 것이 얼마나 쉬운지를 확인했다. 고급 사용자들을 위해 Mercurial은 소스 코드를 관리하고 설치된 Mercurial과의 상호 작용을 사용자 정의하는 데 도움이 되는 다양한 고급 명령과 구성 옵션을 제공한다.
교육
-
Mercurial 홈 페이지는 Mercurial 관련 정보를 얻을 수 있는 좋은 시작점이며 기타 다양한 관련 정보 소스를 확인할 수 있는 링크를 제공한다.
-
Mercurial: The Definitive Guide(Bryan O'Sullivan)는 Mercurial과 관련된 완벽한 참고자료이다. 이 책의 전체 텍스트는 종이 책이 독자의 우편함에
도착할 때까지 온라인에서 HTML과 epub 형식으로 이용할 수 있다.
-
Joel Spolsky의 hginit.com 사이트에는 Mercurial을 사용하는 데 필요한 우수한 소개 튜토리얼이 있다.
-
Mercurial을 사용하는 프로젝트로는 Mozilla, IcedTea, 및 MoinMoin wiki가 있다. 더 자세한 사례는 Mercurial 사이트에 있는 목록을 확인하자.
-
Linux developerWorks 영역과 AIX 및 UNIX developerWorks 영역에는 Linux, AIX 및 일반 UNIX 시스템 관리 분야와 관련된 다양한 정보와
AIX, Linux 및 UNIX 기술을 발전시킬 수 있는 다양한 정보가 있다.
-
Linux 입문 또는 AIX 및 UNIX 입문. 자세히 배우려면 해당 입문 페이지를 확인하자.
-
기술 서점에서 다양한 기술 주제와 관련된 서적을 살펴보자.
제품 및 기술 얻기
-
Mercurial wiki의 다운로드 페이지에는 지원되는 모든 플랫폼을 위한 Mercurial의 컴파일된 버전을 가리키는 링크가 있다.
-
TortiseHG는 Microsoft Windows 시스템을 위한 명령행 Mercurial 애플리케이션과 쉘 확장을 제공한다.
-
MercurialEclipse 플러그인은 Eclipse IDE(Integrated Development Environment) 내에서 Mercurial을 지원한다.
-
FogCreek Software의 Kiln은 무료 시험판과 학생용 버전 및 시작 버전을 온라인 Git 호스팅 서비스(예: GitHub, Repo.Org.Cz)와 비슷한 Mercurial 기반 호스팅 서비스를
통해 제공한다.
-
BitBucket은 온라인(즉, Mercurial 기반 호스팅 서비스)에서 오픈 소스 프로젝트를 위한 무료 호스팅 서비스를 제공할 뿐만 아니라 대규모 개발자 그룹을 위한
유료 호스팅 계획도 제공한다.
-
Windows용 Git인 msysGit를 탐구하자.
토론
-
developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.
-
다음과 같은 AIX, Linux 및 UNIX 포럼에 참여하자.
- AIX 포럼
- 개발자용 AIX 포럼
- IBM Support Assistant 포럼
- Linux for Power Architecture 포럼
- Linux Tech Support 포럼
- 기타 AIX 및 UNIX 및 Linux 포럼
William von Hagen은 20여 년간 UNIX 시스템 관리자로 일하며 다양한 기술적 주제에 관해 집필해왔고, 1993년 이후로는 Linux를 적극 지지하며 활발한 활동을 펼치고 있다. Bill은 Ubuntu Linux, Xen Virtualization, GCC(GNU Compiler Collection), SUSE Linux, Mac OS X, Linux 파일 시스템 및 SGML과 같은 주제에 관한 서적의 저자 또는 공동 저자이기도 하다. Bill은 Linux 및 Mac OS X 관련 출판물과 웹 사이트에 게재된 수많은 기사를 작성하기도 했다. Bill의 이메일 주소는 wvh@vonhagen.org이다.