Computing2011. 7. 4. 11:10

최근 좋은 내용은 이렇게 퍼날르게 되는 안좋은 습관이;;;
아래 내용은 http://ncanis.tistory.com/247의 내용을 퍼왔습니다.

****************************************************************************************************************
Mercurial에 대한 부분이 궁금하여 자료를 정리해 보았습니다.
많은 분들에게 도움이 됬으면 하네요.

1. Mercurial 이란?
Svn의 단점을 대체할 Source Control management 를 말합니다.
아래의 특징이 있습니다.
홈페이지 : http://mercurial.selenic.com

- 분산 설계
  : 전통적인 SVN,CVS방식은 서버-클라이언트 방식으로, 해당 중앙서버가 작동하지 않으면 Commit을 비롯한 모든 작업을 할수 없습니다. 하지만 Mercurial은 각각 로컬에 모든 개발 History를 저장합니다.
즉, 각자가 모두 서버역할도 같이 하게 됩니다.

- 빠릅니다.
데이터 구조가 매우 빠르게 설계되어 있습니다. 소스 비교, 롤백등에 대한 정보를 자세히 저장하고 있기때문에 빠른 비교가 가능합니다.

- 플랫폼 상관 없음
Physon 과 성능을위한 C가 사용되어 개발되어 있습니다. 거의 모든 플랫폼에서 사용가능합니다.

- 확장성
여러 기능에 대해 확장할 수 있도록 설계되어 있습니다.
( 어딘가를 보니 웹 프로토콜을 이용해서 인증을 거치게 해놓았더군요)

- 사용이 편리하다
SVN 과 비슷하여 쉽게 적응가능합니다. (다만 몇가지는 조심해야할 부분이 있네요  )

- 오픈소스

2. Mercurial 과 Git
Mercurial 은 Google에서 지원하고 있습니다.
Git에 비해 쉽습니다.
Git:  http://www.git-scm.com/
Git 도 DVCS 방식입니다.
재미있게 설명한 글이 아래에 있으니 참고하세요.
http://importantshock.wordpress.com/2008/08/07/git-vs-mercurial/
Git: 맥가이버
Mercurial : 제임스 본드 로 비교했네요 ㅎㅎ

3. Mercurial  설정
(1) Mercurial 설치
http://mercurial.selenic.com/downloads 에서 Mercurial 다운로드 받으세요.
(2010년 7월 27일 기준 1.6, Snapshot 기준 1.7)
사용자 삽입 이미지

설치는 원하는 곳에 하면 됩니다.

(2) TortoiseHg Tool 설치하기
이제 Tool을 설치해 봅시다.
http://tortoisehg.bitbucket.org/ 에 가서
설치를 다하게 되면 마우스 우측 이벤트에 아래와 같이 등록됩니다.
(현재 1.1.1 이 나와있군요.)

이 메뉴를 통해 Repository를 관리하시면 되겠죠?
사용자 삽입 이미지

자아 아래는 Create Repository Here를 이용해 repo라는 repository를 만들어 봤습니다.

사용자 삽입 이미지

(3) Eclipse를 위한 Mercurial Plug-in 설치하기
Eclipse를 위한 Plug-in을 설치해 좀더 편하게 사용할 수 있습니다.
현재 http://javaforge.com/project/HGE 으로 1.6.0이(2010년 7월 기준) 릴리즈 되었습니다.
몇가지 문제점이 있으나 곧 해결될것이라 봅니다.

Eclipse>Help>Install new Software 를 선택해 http://cbes.javaforge.com/update 를 등록합니다.

사용자 삽입 이미지

자아 설치하고 Eclipse를 재시작하게 되면 아래와 같이 Team 카테고리에 메뉴들이 쭈욱 뜨게 됩니다.

사용자 삽입 이미지

이제 설치가 다 되었으니 이해하기 쉽게 mercurial console 명령어와
Eclipse plugin 메뉴를 이용해 각 부분을 설명해 드리겠습니다.

4. Mercurial 사용하기
여기에서의 설명은 3가지로 나누어 비교하기로 하겠습니다.
hg 콘솔 명령어: Console
Macurial 메뉴 명령 : 마우스 오른쪽 선택시 나오는 메뉴 (Tool)
Eclipse Plugin 메뉴 : Eclipse

로 분류하겠습니다. 그리고 자주 사용해야하는 기능에 대해서만 설명하겠습니다.

Repository 생성하기
Console: hg init
Tool: TortoiseHg>Create Repository Here
Eclipse: Mercurial Repositories 메뉴/new Repository 선택


Server 띄위기
특정 repository를 띄워 외부에서 이곳으로 접근하게 할 수 있습니다.
(SVN으로 치면 이곳이 서버가 되고, 상대방이 클라이언트가 되겠죠)
Console: hg serve
Tool: TortoiseHg>Web Server
Eclipse: Team>Server  (1.6 플러그인에서 Server 실행은 비추천, Stop하는게 없습니다.)
사용자 삽입 이미지
<TotoiseHg 의 메뉴 화면- Commit은 자주쓰는 메뉴라 그런지 밖으로 나와 있다>

파일 및 폴더 추가
등록한 폴더나 파일을 Mercurial에 등록합니다.
(이렇게 등록한 파일들만 Commit 할 수 있습니다.)
Console: hg add
Tool: TortoiseHg>add files
Eclipse: Team>add


Commit 하기
Commit을 하게 되면 서버가 아닌 로컬에 등록된다. 즉 History가 자기 컴퓨터에 저장된다.
Console: hg commit
Tool: Hg Commit
Eclipse: Team>Commit


Push하기
로컬 History가 아닌 지정한 원격지에 작업한 파일을 Push 합니다.
(SVN 으로 보면 Server에 Commit한게 되는 겁니다.)
즉 공동저장소에 저장하는것이기 때문에 반드시 지켜야 하는 규칙이 있습니다.
#필독
- Push를 하기전 반드시 Pull을 해서 새로운 데이터를 수신받으세요.
- Conflict가 있을경우 Merge를 이용해 정리한후 Push 해야 합니다.
  ( 같은
- Push force 를 이용해 강제로 push하시면 안됩니다.
  제대로 된 History를 쌓을 수 없습니다.


Console: hg push
Tool: TortoiseHg> Synchronize 선택 Push 선택
Eclipse: Team> Push


Update 하기
로컬 History에서 데이터를 업데이트하게 됩니다.
Console: hg update
Tool: TortoiseHg>update


Pull하기
연결된 원격 저장소로부터 최신 내용을 로컬 Repository로 가져옵니다.
(Svn의 Update가 되겠죠)
Console: hg pull
Tool: TortoiseHg> Synchronize 선택 Pull 선택
Eclipse: Team>Pull
- 이클립스에서 보면 Pull Option도 선택할 수 있습니다.
 Update after pull
 Clean update(override local changes) : 원격지 소스로 모두 덮어씌우는게 되겠군요.
 Rebase after pull
 Pull even where remote repository is unrelated
 Merge and if there are no conflicts, commit after update
 Abort pull when a timeout occurs


사용자 삽입 이미지
<Eclipse 에서의 Pull >

복구 기능
- Revert : 마지막에 Commit한 그 시점으로 해당 소스들을 되돌리는 것을 말합니다.
- Rollback :
- Backout :
- Strip :



쓸만한 기능 - Search History
툴을 이용하면 편하게 검색할 수있다.( Eclipse Plug-in에는 없다.)
Tool>Search History 를 선택한다.

사용자 삽입 이미지

소스에 test란 text가 들어가고 src 패스에 존재하는 소스 History들을 검색해서 보여줍니다.
http://tortoisehg.bitbucket.org/manual/1.1/datamine.html 에 있는 설명 문서를 참고하세요.


5. 웹서버 띄위기
  다음 아래 Doc를 참고하면 각 서버와의 연동에 따른 장단점을 비교할 수 있다.http://mercurial.selenic.com/wiki/PublishingRepositories
(예를 들면, hg serve 라는 기본 설정을 사용한다면 인증에 관한 설정을 할 수 없다는 것이다.)

Solution

Mechanism

Push?

Browsable

Advantages

Disadvantages

Public

hg serve

HTTP

off by default

yes

built-in

push has no authentication, so can only be used on trusted internal networks

static HTTP

HTTP/HTTPS

no

no

does not require hg or CGI support on the server

very slow

hgweb {*}

off by default

yes

can use existing web server (CGI, WSGI, mod_python), including authentication

web server config can be hard to debug

hgwebdir {*}

off by default

yes

can use existing web server (CGI, WSGI, mod_python), including authentication, supports multiple repositories

slightly more work to setup than hgweb

hg serve behind a proxy (Nginx)

yes

yes

multiple repos, permits authentication, no CGI

requires proxy (Nginx, HAProxy)

third-party hosting

yes

yes

minimal setup

not locally administered, may have fees

Private/internal

ssh

SSH

yes

no

no additional setup

requires Unix server, per-user accounts and repositories

SharedSSH

SSH (but with shared accounts)

yes

no

easy key management, fine-grained permissions

requires Unix server, not built in

shared disk

NFS/Samba etc.

yes

no

can use existing setup

generally restricted to intranets



6. Mercurial 에 인증시스템을 넣어보자
: 현재 Mercurial 에 인증시스템을 넣는것은 상당히 어렵습니다. 특히 Apache와 연동해 인증시스템을 구축하는것은 정말 최악입니다. 왜 Mercurial이 이런 인증 시스템을 제공하지 않는지 궁금하군요.
- DB 테이블을 통한 인증
- 계정 리스트 파일을 통한 인증

이 2개만 지원해주면 참 좋겠는데 말이죠. 물론 DVCS 시스템 하에서는 이런 인증시스템이 의미가 없을 수 있습니다. 어짜피 로컬에 모든정보가 저장되니 말이죠.

만약 이런 기능을 원하시는 분이 있다면 Http Proxy 기능을 직접 만드시길 바랍니다.
즉 중앙서버에서는 hg serve 로 서버를 열고 Proxy Server가 외부를 깜싸는 형태죠.
모든 외부 클라이언트는 Proxy 를 통해서 접근해야 합니다.
그렇다면 이때 Proxy Server에서 해당 요청 주소에 대해 Http Basic 인증시스템을 적용할 수 있습니다.

현재 저도 이렇게 구현했습니다.
구조도 간단해지고, 본인이 원하는 어떤 언어로도 가능하니 이보다 좋은게 없습니다.


* Mercurial 에 도움될만한 사이트
1. http://hginit.com : 조엘 스폴스키가 쓴 Mercurial 강좌
                          처음에 이사람도 거부하다가 여기에 빠져들었네요. svn에서 이쪽으로 전환하는 것을 강력하게 추천하고 있습니다.
2. http://importantshock.wordpress.com/2008/08/07/git-vs-mercurial/ : Git과 Mercurial 비교

Posted by 버터백통