머큐리얼 큐(Mercurial Queues)

dev | 2014-06-08

깃(Git)이 대세이기는 하지만 상환의 영향으로 머큐리얼(Mercurial; hg)에도 계속 관심이 간다. 모질라(Mozilla)도 많은 프로젝트의 버전관리를 머큐리얼로 하고 있어서 더욱 그러하다. 모질라에서는 패치를 리뷰받기 위해서 머큐리얼 큐(Mercurial Queues; mq)를 사용하고 있는데 한번 사용해 봤다.

요새는 패치를 보내면 풀 리퀘스트(pull request)로 보내라는 답변이 온다고는 하지만 패치와 풀 리퀘스트는 엄연히 다르다. 풀 리퀘스트보다 패치가 좋은 측면도 분명히 있다. 머큐리얼 큐는 머큐리얼의 확장기능이기는 하지만 머큐리얼 배포에 포함되어 있어서 바로 사용할 수 있다. 깃에도 비슷한 기능이나 개념이 있는지 궁금해서 찾아봤는데 StGit이나 Guilt와 같은 기능이 있다고 한다. 스태싱이나 브랜칭, 체리 픽과 같은 기능 만으로 패치 관리와 같은 효과를 내기는 힘들다는 반증으로 생각된다.

머큐리얼 큐를 사용하려면 간단히 qinit 명령으로 초기화 해주면 된다.

hg qinit

그러면 .hg/patches 폴더가 생긴다.

코드를 변경한 다음에 qnew 명령을 사용해서 패치를 생성할 수 있다.

hg qnew my.patch

그러면 .hg/patches 디렉토리 안에 my.patch 파일이 생성된다. 이 파일은 다른 사람에게 전달도 가능하고 사용자나 커밋 메시지를 명시할 수도 있다. 다른사람이 이 패치 파일을 받아서 커밋 권한이 없는 사람의 정보를 유지한 채로 대신 커밋해주는 것이 가능하다.

또한 이 패치는 계속해서 업데이트가 가능하다. 패치의 업데이트는 qrefresh 명령을 사용한다.

hg qrefresh

qrefresh-e 옵션을 주면 에디터가 열리고 여기서 커밋 메시지를 입력할 수 있다. -m 옵션으로 커맨드라인에서 바로 입력할 수도 있다.

패치를 여러개 만들 수도 있다. 현재 존재하는 패치의 목록은 qseries 명령으로 확인 할 수 있다.

hg qseries

그러면 현재 .hg/patches 디렉토리 안에 있는 패치의 목록을 확인할 수 있다. 이 패치들을 선별적으로 적용했다가 다시 원복하는 일이 가능하다. qpop 명령을 이용하면 패치 적용을 취소할 수 있다.

hg qpop

이를 실행하면 변경 내역을 취소하고 변경하기 전 상태로 되돌아 간다. -a 옵션을 이용해서 한꺼번에 모두 취소할 수도 있다.

패치 목록에서 패치를 선택해서 적용할 때에는 qpush 명령을 이용한다.

hg qpush patch-name

적용된 패치는 qapplied 명령으로, 적용되지 않은 패지는 qunapplied 명령으로 확인 할 수 있다.

이렇게 여러개의 패치를 만들어서 선별젹으로 적용, 취소 할 수 있고 패치 파일을 다른 사람에게 보낼 수도 있다. 다른 사람으로 부터 받은 패치를 적용할 때에는 qimport 명령을 사용한다. qimport의 인자로는 파일명도 되지만 URL도 입력할 수 있다. 모질라 버그 질라에 올라온 패치를 링크만 복사해서 바로 적용해 볼 수 있다.

hg qimport http://example.com/where/patch/located/my.patch

패치가 완성되어서 커밋을 할 시점!이 오면 qfinish를 이용해서 패치를 커밋으로 추가할 수 있다.

hg qfinish tip

맨 마지막에 있는 패치부터 적용이 되고 -a 옵션을 주면 모두 적용된다.

메뉴얼들을 보면 주의할 점이 몇가지 있다고 한다.

  1. qrefresh는 커밋처럼 히스토리를 남기지 않고 이전 패치를 덮어쓴다.
  2. 패치가 적용된 상태에서 저장소를 업데이트 하는 일은 별로 좋은 생각이 아니니 hg qpop -a로 패치 적용을 해제하고 업데이트 받아라.
  3. 머큐리얼을 설정할 때 깃 형태의 diff를 사용해서 바이너리 파일의 변경도 패치를 만들 수 있다고 한다.
  4. 다른사람이 풀하는 저장소에서는 사용하지 말라고 한다(왜?).

실제로 사용해 보면 브랜칭하고 리베이스하고 머지하는 그런 작업에 비해 상당히 직관적이고 간편하다. 작업하다가 치우고 다른 작업하다가 다시 불러오고 하는 일련의 과정이 상당히 간단해 진다. 깃은 푸시가 되기 전이라면(또는 푸시가 된 이후에도) 체인지 셋을 마음대로 변경하는 것이 가능한데 머큐리얼은 기본적으로 체인지셋은 변경하지 않는 것을 전제로 한다고 한다. 그래서 더 많이 쓰는지도 모르겠다.

암튼 뭐가 됐든 많이 쓰는 입장은 아니기 때문에 이정도로 끝...

Comments

    Post a comment

    :

    : 공개 되지 않습니다. Gravatar를 표시 합니다.

    :

    : HTML 태그를 사용할 수 없습니다.