Introduction To Mercurial Phases (Part II)

원문: http://www.logilab.org/blogentry/88219

이 글은 머큐리얼(Mercurial) 2.1에 구현한 새 기능인 상태(phases)에 관한 일련의 글 중 두 번째입니다. 첫 번째 글에서는 상태가 머큐리얼 사용자에게 어떻게 도움이 되는지를 얘기했으며 이 글에서는 어떻게 제어하는지를 설명합니다.

자동으로 이동하는 상태 제어하기

때로는 마무리하지 못한 작업 내용을 공유해야 해서 체인지셋을 초안(draft) 상태로 원격 저장소에 보내거나 그 저장소에서 받아오는 게 적절할 수도 있습니다. 몇 가지 예를 들어 보면 다음과 같은 경우입니다.

  • 지속적인 통합을 위해 원격 저장소로 보낼 때
  • 리뷰를 하기 위해 체인지셋을 원격 저장소 보낼 때
  • 사용자가 여러 머신에서 작업할 때
  • 브랜치를 복제할 때

저장소 설정 파일에서 배포 동작을 비활성화할 수 있습니다.

[phases]
publish=False

저장소를 배포할 수 없게 설정하면 상태 변경 없이 체인지셋을 다른 저장소로 보낼 수 있습니다. 초안인 체인지셋은 초안으로, 공개인 체인지셋은 공개 상태를 그대로 유지한 채 다른 저장소로 들어갑니다.

[email protected] ~/palace $ hg showconfig phases
phases.publish=False
[email protected] ~/palace $ hg log --graph
@  [draft] add a carpet (2afbcfd2af83)
|
o  [public] Add a table in the kichen (139ead8a540f)
|
o  [public] Add wall color (0d1feb1bca54)
|
…
[email protected] ~/palace $ hg outgoing ~celeste/palace/
[public] Add wall color (0d1feb1bca54)
[public] Add a table in the kichen (139ead8a540f)
[draft] add a carpet (3c1b19d5d3f5)
[email protected] ~/palace $ hg push ~celeste/palace/
pushing to ~celeste/palace/
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 2 files
[email protected] ~/palace $ hg log --graph
@  [draft] add a carpet (2afbcfd2af83)
|
o  [public] Add a table in the kichen (139ead8a540f)
|
o  [public] Add wall color (0d1feb1bca54)
|
…
[email protected] ~/palace $ hg log --graph
o  [draft] add a carpet (2afbcfd2af83)
|
o  [public] Add a table in the kichen (139ead8a540f)
|
o  [public] Add wall color (0d1feb1bca54)
|
…

그리고 그 원격 저장소에서 가져오면 그 저장소에 있는 상태를 그대로 유지합니다.

[email protected] ~/palace $ hg up 139ead8a540f
[email protected] ~/palace $ echo The wall will be decorated with portraits >> bedroom
[email protected] ~/palace $ hg ci -m 'Decorate the wall.'
created new head
[email protected] ~/palace $ hg log --graph
@  [draft] Decorate the wall. (3389164e92a1)
|
| o  [draft] add a carpet (3c1b19d5d3f5)
|/
o  [public] Add a table in the kichen (139ead8a540f)
|
o  [public] Add wall color (0d1feb1bca54)
|
…
---
[email protected] ~/palace $ hg pull ~celeste/palace/
pulling from ~celeste/palace/
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
[email protected] ~/palace $ hg log --graph
@  [draft] Decorate the wall. (3389164e92a1)
|
| o  [draft] add a carpet (3c1b19d5d3f5)
|/
o  [public] Add a table in the kichen (139ead8a540f)
|
o  [public] Add wall color (0d1feb1bca54)
|
…

상태 정보는 pullpush 동작을 할 때 교환합니다. 어떤 체인지셋이 양쪽 저장소에 모두 있으면서 상태가 다르다면 가장 낮은 상태로 통일합니다. 예를 들어 어떤 체인지셋이 지역 저장소에서는 초안이지만 원격 저장소에서는 공개라면 공개로 설정합니다.

[email protected] ~/palace $ hg push -r 3389164e92a1
pushing to http://hg.celesteville.com/palace
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
[email protected] ~/palace $ hg log --graph
@  [public] Decorate the wall. (3389164e92a1)
|
| o  [draft] add a carpet (3c1b19d5d3f5)
|/
o  [public] Add a table in the kichen (139ead8a540f)
|
o  [public] Add wall color (0d1feb1bca54)
|
…
---
[email protected] ~/palace $ hg pull ~celeste/palace/
pulling from ~celeste/palace/
searching for changes
no changes found
[email protected] ~/palace $ hg log --graph
@  [public] Decorate the wall. (3389164e92a1)
|
| o  [draft] add a carpet (3c1b19d5d3f5)
|/
o  [public] Add a table in the kichen (139ead8a540f)
|
o  [public] Add wall color (0d1feb1bca54)
|
…

참고: pull은 읽기 전용 동작이며 원격 저장소에 있는 상태를 바꾸지 않습니다.

새로 커밋하는 체인지셋의 상태를 제어할 수도 있습니다. 새 체인지셋 중 명시적으로 승인한 것만 다른 저장소로 보내려면 설정을 다음처럼 바꿉니다.

[phases]
new-commit=secret

이제 체인지셋을 다른 저장소로 보내려면 상태 이동을 직접 처리해야 합니다. 자세한 내용은 다음 절에서 설명합니다.

참고: 지금까지 다룬 내용과 함께 ‘새 커밋을 비공개로 만드는 가장 실용적인 방법’은 다음처럼 하는 겁니다.

hg commit --config phases.new-commit=secret

상태 이동 직접 처리하기

상태 이동은 대부분 인식하지 못하는 사이에 자동으로 처리됩니다. 하지만 여전히 hg phase 명령으로 직접 상태 이동을 처리할 수도 있습니다.

[email protected] ~/palace $ hg log --graph
@    [draft] merge with Celeste works (f728ef4eba9f)
|\
o |  [draft] add a carpet (3c1b19d5d3f5)
| |
| o  [public] Decorate the wall. (3389164e92a1)
|/
o  [public] Add a table in the kichen (139ead8a540f)
|
…
[email protected] ~/palace $ hg phase --public 3c1b19d5d3f5
[email protected] ~/palace $ hg log --graph
@    [draft] merge with Celeste works (f728ef4eba9f)
|\
o |  [public] add a carpet (3c1b19d5d3f5)
| |
| o  [public] Decorate the wall. (3389164e92a1)
|/
o  [public] Add a table in the kichen (139ead8a540f)
|
…

체인지셋은 일반적인 동작을 하는 동안 더 낮은 상태로만 이동합니다. 기본적으로 상태 명령은 이 규칙을 따릅니다.

[email protected] ~/palace $ hg phase --draft 3c1b19d5d3f5
no phases changed
[email protected] ~/palace $ hg log --graph
@    [draft] merge with Celeste works (f728ef4eba9f)
|\
o |  [public] add a carpet (3c1b19d5d3f5)
| |
| o  [public] Decorate the wall. (3389164e92a1)
|/
o  [public] Add a table in the kichen (139ead8a540f)
|
…

하지만 --force 스위치를 사용해 이런 동작을 무시할 수도 있습니다.

경고: 상태는 사용자가 hg phase --force 를 사용하지 않아도 되도록 설계했습니다. 만약 --force를 사용해야 하는 일반적인 이유가 있다면 뭔가 잘못하고 있는 겁니다. 자신의 요구에 적합하게 상태 이동이 자동으로 처리되도록 설정하는 방법을 보려면 이전 절 내용을 읽어 보세요.

[email protected] ~/palace $ hg phase --verbose --force --draft 3c1b19d5d3f5
phase change for 1 changesets
[email protected] ~/palace $ hg log --graph
@    [draft] merge with Celeste works (f728ef4eba9f)
|\
o |  [draft] add a carpet (3c1b19d5d3f5)
| |
| o  [public] Decorate the wall. (3389164e92a1)
|/
o  [public] Add a table in the kichen (139ead8a540f)
|
…

이력 그래프에서 상태가 일관된 리비전 집합을 정의하고 있는 점에 주목합니다. 즉 (변경할 수 없는) 공개 체인지셋의 조상은 모두 변경 불가 상태여야 한다는 것을 뜻합니다. 또한 (교환할 수 없는) 비공개 체인지셋의 후손은 모두 비공개가 됩니다. 이는 체인지셋의 상태를 바꾸는 것은 결국 다른 체인지셋의 상태를 바꿀 수도 있다는 것을 뜻합니다.

[email protected] ~/palace $ hg phase -v --public f728ef4eba9f # merge with Celeste works
phase change for 2 changesets
[email protected] ~/palace $ hg log --graph
@    [public] merge with Celeste works (f728ef4eba9f)
|\
o |  [public] add a carpet (3c1b19d5d3f5)
| |
| o  [public] Decorate the wall. (3389164e92a1)
|/
o  [public] Add a table in the kichen (139ead8a540f)
|
…
[email protected] ~/palace $ hg phase -vf --draft 3c1b19d5d3f5 # add a carpet
phase change for 2 changesets
[email protected] ~/palace $ hg log --graph
@    [draft] merge with Celeste works (f728ef4eba9f)
|\
o |  [draft] add a carpet (3c1b19d5d3f5)
| |
| o  [public] Decorate the wall. (3389164e92a1)
|/
o  [public] Add a table in the kichen (139ead8a540f)
|
…

다음이자 마지막 글에서는 이전 버전 머큐리얼과 상태를 지원하는 새 버전을 함께 쓰는 법에 대해 설명합니다.

Notes:
1. 자신의 hgrc 파일에서 설정해도 됩니다.
2. 상태 순서는 공개 < 초안 < 비공개 입니다.
자신의 hgrc 파일에서 설정해도 됩니다.
상태 순서는 공개 < 초안 < 비공개 입니다.

You may also like...