Introduction To Mercurial Phases (Part II)
원문: http://www.logilab.org/blogentry/88219
이 글은 머큐리얼(Mercurial) 2.1에 구현한 새 기능인 상태(phases)에 관한 일련의 글 중 두 번째입니다. 첫 번째 글에서는 상태가 머큐리얼 사용자에게 어떻게 도움이 되는지를 얘기했으며 이 글에서는 어떻게 제어하는지를 설명합니다.
자동으로 이동하는 상태 제어하기
때로는 마무리하지 못한 작업 내용을 공유해야 해서 체인지셋을 초안(draft) 상태로 원격 저장소에 보내거나 그 저장소에서 받아오는 게 적절할 수도 있습니다. 몇 가지 예를 들어 보면 다음과 같은 경우입니다.
- 지속적인 통합을 위해 원격 저장소로 보낼 때
- 리뷰를 하기 위해 체인지셋을 원격 저장소 보낼 때
- 사용자가 여러 머신에서 작업할 때
- 브랜치를 복제할 때
저장소 설정 파일에서 배포 동작을 비활성화할 수 있습니다.
1 2 |
[phases] publish=False |
저장소를 배포할 수 없게 설정하면 상태 변경 없이 체인지셋을 다른 저장소로 보낼 수 있습니다. 초안인 체인지셋은 초안으로, 공개인 체인지셋은 공개 상태를 그대로 유지한 채 다른 저장소로 들어갑니다.
1 2 |
celeste@Chessy ~/palace $ hg showconfig phases phases.publish=False |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
babar@Chessy ~/palace $ hg log --graph @ [draft] add a carpet (2afbcfd2af83) | o [public] Add a table in the kichen (139ead8a540f) | o [public] Add wall color (0d1feb1bca54) | … babar@Chessy ~/palace $ hg outgoing ~celeste/palace/ [public] Add wall color (0d1feb1bca54) [public] Add a table in the kichen (139ead8a540f) [draft] add a carpet (3c1b19d5d3f5) babar@Chessy ~/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 babar@Chessy ~/palace $ hg log --graph @ [draft] add a carpet (2afbcfd2af83) | o [public] Add a table in the kichen (139ead8a540f) | o [public] Add wall color (0d1feb1bca54) | … |
1 2 3 4 5 6 7 8 |
celeste@Chessy ~/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) | … |
그리고 그 원격 저장소에서 가져오면 그 저장소에 있는 상태를 그대로 유지합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
celeste@Chessy ~/palace $ hg up 139ead8a540f celeste@Chessy ~/palace $ echo The wall will be decorated with portraits >> bedroom celeste@Chessy ~/palace $ hg ci -m 'Decorate the wall.' created new head celeste@Chessy ~/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) | … --- babar@Chessy ~/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) babar@Chessy ~/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) | … |
상태 정보는 pull
과 push
동작을 할 때 교환합니다. 어떤 체인지셋이 양쪽 저장소에 모두 있으면서 상태가 다르다면 가장 낮은 상태로 통일합니다. 예를 들어 어떤 체인지셋이 지역 저장소에서는 초안이지만 원격 저장소에서는 공개라면 공개로 설정합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
celeste@Chessy ~/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 celeste@Chessy ~/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) | … --- babar@Chessy ~/palace $ hg pull ~celeste/palace/ pulling from ~celeste/palace/ searching for changes no changes found babar@Chessy ~/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
은 읽기 전용 동작이며 원격 저장소에 있는 상태를 바꾸지 않습니다.
새로 커밋하는 체인지셋의 상태를 제어할 수도 있습니다. 새 체인지셋 중 명시적으로 승인한 것만 다른 저장소로 보내려면 설정을 다음처럼 바꿉니다.
1 2 |
[phases] new-commit=secret |
이제 체인지셋을 다른 저장소로 보내려면 상태 이동을 직접 처리해야 합니다. 자세한 내용은 다음 절에서 설명합니다.
참고: 지금까지 다룬 내용과 함께 ‘새 커밋을 비공개로 만드는 가장 실용적인 방법’은 다음처럼 하는 겁니다.
1 hg commit --config phases.new-commit=secret
상태 이동 직접 처리하기
상태 이동은 대부분 인식하지 못하는 사이에 자동으로 처리됩니다. 하지만 여전히 hg phase
명령으로 직접 상태 이동을 처리할 수도 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
babar@Chessy ~/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) | … babar@Chessy ~/palace $ hg phase --public 3c1b19d5d3f5 babar@Chessy ~/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) | … |
체인지셋은 일반적인 동작을 하는 동안 더 낮은 상태로만 이동합니다. 기본적으로 상태 명령은 이 규칙을 따릅니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
babar@Chessy ~/palace $ hg phase --draft 3c1b19d5d3f5 no phases changed babar@Chessy ~/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
를 사용해야 하는 일반적인 이유가 있다면 뭔가 잘못하고 있는 겁니다. 자신의 요구에 적합하게 상태 이동이 자동으로 처리되도록 설정하는 방법을 보려면 이전 절 내용을 읽어 보세요.
1 2 3 4 5 6 7 8 9 10 11 12 |
babar@Chessy ~/palace $ hg phase --verbose --force --draft 3c1b19d5d3f5 phase change for 1 changesets babar@Chessy ~/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) | … |
이력 그래프에서 상태가 일관된 리비전 집합을 정의하고 있는 점에 주목합니다. 즉 (변경할 수 없는) 공개 체인지셋의 조상은 모두 변경 불가 상태여야 한다는 것을 뜻합니다. 또한 (교환할 수 없는) 비공개 체인지셋의 후손은 모두 비공개가 됩니다. 이는 체인지셋의 상태를 바꾸는 것은 결국 다른 체인지셋의 상태를 바꿀 수도 있다는 것을 뜻합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
babar@Chessy ~/palace $ hg phase -v --public f728ef4eba9f # merge with Celeste works phase change for 2 changesets babar@Chessy ~/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) | … babar@Chessy ~/palace $ hg phase -vf --draft 3c1b19d5d3f5 # add a carpet phase change for 2 changesets babar@Chessy ~/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) | … |
다음이자 마지막 글에서는 이전 버전 머큐리얼과 상태를 지원하는 새 버전을 함께 쓰는 법에 대해 설명합니다.