Introduction To Mercurial Phases (Part III)

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

이 글은 머큐리얼(Mercurial) 2.1에 구현한 새 기능인 상태(phases)에 대한 일련의 글 중 마지막입니다. 첫 번째 글에서는 상태가 머큐리얼 사용자에게 어떻게 도움이 되는지, 두 번째 글에서는 상태를 어떻게 제어하는지를 설명했습니다. 이 글에서는 업그레이드할 때 주의할 점이 무엇인지 설명합니다.

업그레이드할 때 주의할 점과 하위 호환성

상태를 쓰더라도 저장소를 변환하는 과정은 없습니다. 상태 정보는 체인지셋에 저장하지 않으며 새로운 클라이언트를 쓰는 모든 사용자는 상태의 이점을 얻을 수 있습니다. 하지만 상태가 없는 이전 세계와 상태가 생긴 새로운 세계 사이에 교류에 대해서는 몇 가지 주의해야 할 점이 있습니다.

상태를 사용하는 클라이언트를 사용해 상태를 사용하지 않는 서버와 통신하기

항상 그렇듯이 (http와 ssh를 통해 통신하는) 머큐리얼 통신 프로토콜은 하위 버전과 완전히 호환됩니다. 다만 이전 버전 머큐리얼에서 상태를 인식하지 못하는 것처럼 오래된 서버는 항상 배포 기능이 활성화된 것으로 처리합니다.

상태를 사용하는 클라이언트를 사용해 상태를 사용하지 않는 저장소의 파일 시스템에 직접 접근하기

새 클라이언트에는 이력 중 변경할 수 있는 것과 그렇지 못한 것을 구별할 방법이 없습니다. 안전하게 처리하기 위해 새 저장소에 사용할 수 있는 정보가 없으면 모두 공개(public)로 표시합니다. 첫 번째 글에서 설명한 예에서 만약 머큐리얼 이전 버전으로 복제와 커밋을 하면 새 버전에서는 그 내용을 모두 공개로 인식하고 재배치를 거부합니다.

참고
(mq처럼) 일부 확장 기능에서는 체인지셋을 초안(draft)이나 비공개(secret) 상태로 설정하는 더 영리한 로직을 제공할 수도 있습니다.

상태를 사용하는 클라이언트는 이전 버전으로 사용하던 저장소에 처음 쓰기 동작을 할 때 상태 정보를 기록합니다.

상태를 사용하지 않는 클라이언트를 사용해 상태를 사용하는 저장소의 파일 시스템에 직접 접근하기

이전 버전 클라이언트에서 상태를 보거나 처리할 수 없는 점만 제외하면 모든 것이 잘 동작합니다.

  • 그 저장소에 추가한 체인지셋은 부모의 상태가 무엇이든 해당 부모 상태를 상속합니다. 이 때문에 새 버전 클라이언트로 그 저장소에 접속해 보면 새로 커밋한 것이 공개 상태이거나 pull로 가져온 변경 내용이 초안이나 비공개일 수도 있습니다.
  • 배포 서버로 보낸 체인지셋이 공개로 설정되지 않습니다.
  • 비공개 체인지셋을 교환할 수 있습니다.
  • 이전 버전 클라이언트에서는 변경할 수 없는 체인지셋을 (인식하지 못하므로) 다시 기록할 수도 있습니다.

그러므로 이력을 다시 쓰는 일과 비공개 체인지셋 사용이 매우 많다면 상태가 중요한 그런 저장소는 새 클라이언트로만 사용합니다.

상태 오류 수정하기

다음과 같은 몇몇 상황에서는 저장소에 올바르지 않은 상태가 생길 수 있습니다.

  • 상태를 사용하지 않는 머큐리얼을 사용하는 것으로 업그레이드할 때 선택할 수 있는 기본 상태가 매우 제한적일 수 있습니다.
  • 이전 버전 클라이언트로 저장소를 다루도록 허용할 때
  • 실제 배포하지 않아야 하는 것을 배포 서버로 보낼 때

일관된 상태로 되돌리는 가장 쉬운 방법은 상태 명령을 사용하는 겁니다. 대부분의 경우에 실제 공개 서버에 없는 것을 제외하고 공개 상태인 체인지셋은 초안으로 바꿔야 합니다.

hg phase --force --draft 'public() and outgoing()'

공개 서버가 여럿이라면 pull 명령으로 다른 서버 상태 정보를 가져올 수 있습니다.

결론

머큐리얼 상태는 고급 사용자가 조작하는 것을 막지만 사용자 대부분에게 인식하지 못하는 사이에 안전함을 항상 제공하는 간단한 개념입니다. 이 안전하고 유용한 기능 이면으로 상태는 머큐리얼 코드에 변경할 수 있는 이력을 공유하는 개념을 도입했습니다. 즉 이 기능을 도입함으로써 이력에서 변경 가능한 부분을 안전하고 쉽게 공유하면서 이력을 다시 쓰는 향상된 해결책이 생겼습니다. 조만간 앞으로 추가하게 될 그런 기능에 대해 쓸 겁니다.

Notes:
1. 머큐리얼 0.9.0 버전과 5년 후에 나올 버전과도 문제 없이 함께 쓸 수 있을 거라고 기대할 수 있습니다.
머큐리얼 0.9.0 버전과 5년 후에 나올 버전과도 문제 없이 함께 쓸 수 있을 거라고 기대할 수 있습니다.

You may also like...