2009-06-06 1 views
15

저는 Mercurial을 사용하지 않지만 시작하고 싶습니다. 그래서 그것에 대해 읽고 있습니다. 내가 광범위하게 사용한 유일한 SCM 시스템은 CVS뿐입니다. 내가 Mercurial에 관해 읽은 대부분은 이해가되며, 좋은 것 같습니다. 그러나 나는 태그를하는 방식으로 번갈아 가며 충격을 받고 혼란스러워합니다.어떻게 항상 Mercurial의 모든 태그에 대해 알 수 있습니까?

태그는 변경 집합의 닉네임이며 'changeset'은 변경 집합의 결과를 의미합니다. 시원한. 태그에서 변경 집합 ID 로의 매핑은 .hgtags 파일에 저장됩니다. 또한 시원한. .hgtags 파일의 버전이 지정됩니다.

무엇?

이렇게 많은 직관력이 떨어집니다. 예를 들어, 내가 태그 (예 : 릴리스 1.0을 형성 할 코드)를 바꾸려는 변경 집합을 커밋하면 업데이트 된 태그 파일을 저장소에 저장하기 위해 태그를 지정한 후 다시 커밋해야합니다. 그리고 나중에 태그가 붙은 변경 집합으로 업데이트하면 작업 복사본에 해당 태그에 대한 지식이 전혀 포함되지 않습니다. 만약 내가 어떤 일을한다면, 새로운 지점을 창립하면 (말하자면 1.1로 향하는 버그 수정), 그 지점은 그것이 성장한 태그에 대한 어떤 지식도 가지지 못할 것입니다. 수동으로 복사하지 않는 한.

중요한 변경 집합 (트렁크의 2.0 릴리스, 지점의 1.1 및 1.2 버그 수정 릴리즈)을 표시하기 위해 태그가 생성되어 원래 트렁크와 새 분기 모두에서 개발이 진행됨에 따라 두 분기가 계속 진행됩니다 다른 지점의 꼬리표의 무지. 그래서, 만약 하나의 브랜치에서 작업을 끝내고 다른 브리 치의 특정 변경 세트로 바꾸길 원한다면 (예를 들어 1.2 버디 픽스 릴리즈를 마친다.하지만 이제 2.0을 기반으로하는 2.1 버그 픽처에서 시작해야한다.) 이제 나는 채워진다. 현재의 changeset는 2.0에 대해 알지 못합니다!

어떻게해야합니까?

  • 나는 2.0 실제 변경 집합 ID를 읽고, 명시 적으로 사용하도록 2.x는 지점에 근무하는 사람을 요청할 수 있습니다, 그러나 이것은 소름이 끼치는이다.
  • 태그를 사용할뿐만 아니라 내 지사의 이름도 지정할 수 있으므로 2.x 지점의 머리를 건너 뛰어 새 태그에 대해 학습 한 다음 다시 2.0 태그로 건너 뛸 수있었습니다. 태그와 달리 분기가 보편적으로 볼 수 있다고 가정하면 - 그 경우입니까? 비록 그것이라고해도, 이것은 clunky 것처럼 보인다.
  • 하나의 글로벌 hgtags 파일을 저장소 외부에 유지하고 몇 개의 후크를 사용하여 업데이트 사본을 가져 와서 로컬 복사본을 덮어 쓰고 변경 내용을 커밋에 다시 복사 할 수 있습니다. 개발자가 공유 저장소에 변경 사항을 적용하는 다중 사용자 환경에서 이것이 어떻게 작동하는지 확신 할 수 없습니다. hgtags 파일 만 별도의 저장소가 필요할 수도 있습니다.
  • 버전 관리 메커니즘 외부에있는 로컬 태그를 사용할 수 있으므로 전체적인 문제를 피할 수 있습니다. 공유 전역 태그와 마찬가지로 개발자간에 localtags 파일을 동기화하는 메커니즘을 구현해야합니다.

이 솔루션들 중 어느 것도 훌륭한 것으로 보이지 않습니다. 어떻게해야합니까?

여기서 가정은 branch-per-branch보다는 단일 저장소에서 명명 된 분기를 사용하여 관리한다는 것입니다. 후자를했다면 상황이 나아질까요?.hgtags 파일 버전 관리

+0

@ SilentGhost : 'mercurial'태그가 훨씬 더 많이 사용되기 때문에 'hg'태그를 제거했습니다. 하지만 그게 실수 였을까요? –

답변

19

  • 편집 태그에 당신을 허용하고 편집 누구인지 일반적인 메커니즘
를 사용하여 저장소 사이
  • 전송 태그 (그리고 왜 그들은 적절한 커밋 메시지를 남긴 경우)

    그러나 여기에는 약간의 혼란이 있습니다.

    • 당신은 내가 다음 몇 가지 나중에 그 태그 변경 집합에 업데이트 할 경우

      가 [...] 그리고, 작업 복사본이 해당 태그에 대한 지식을 포함하지 않습니다 쓰기. [...]

      잘못

      , 태그는 모든 머리에있는 .hgtags 파일에서 수집됩니다. 즉, 이전 태그 (hg update 0.1)로 업데이트하고 여전히 모든 태그 (hg tags)를 볼 수 있습니다.

    • 분기가 보편적으로 표시되는지 확인합니다. 그렇습니다. 명명 된 가지의 이름은 태그와 같이 변경 집합을 지정해야하는 모든 컨텍스트에서 사용할 수 있습니다.

    이름이있는 분기가 사용하기 전에 무엇인지 이해했는지 확인하십시오. 버그 수정 지점을 만들기 위해 실제로는 이 아니며이 아닙니다. 대신 (hg update 1.0)으로 돌아가서 버그를 수정 한 다음 커밋하도록 선택할 수 있습니다. 그러면 새로운 머리가 생겨 1.1 (이 경우는 multiple heads)으로 발전 할 수 있습니다. 따라서 저장소에 새로운 개발 지점을 추가하기 위해 명명 된 분기를 만들 필요가 없습니다.

    여러 개의 헤드가있는 것은 여러 개의 복제본을 갖는 것과 완전히 동일합니다. 당신은 앞뒤로 변환 할 수 있습니다 : 당신이 repo의 다른 변경 집합에서 X-head 변경 집합 및 조상을 수습하기 위해

    % hg clone -r X-head repo repo-X 
    

    를 사용할 수 있습니다. 또한 모든 변경 집합을 하나의 큰 클론으로 끌어와 여러 클론을 결합 할 수 있습니다.

    Named branches은 유사하지만 아직 다릅니다. 그들은 각 변경 집합에 이름을 삽입 할 수 있습니다. 따라서 "foo"라는 이름으로 역사에 몇 가지 변경 세트를 가질 수 있습니다. hg update foo을 수행하면 이러한 변경 집합의 대부분을 알게 될 것입니다. 이런 식으로 명명 된 분기는 부동 태그의 일종으로 기능합니다.

    변경 세트의 영구 라벨에 대해 불편한 점이 있다면 bookmarks extension을 사용해보세요. 그것은 또한 당신에게 업데이트를 위해 사용할 수있는 "플로팅 태그"를 줄 것이지만, 버전이 만들어지지 않기 때문에 영구히 히스토리의 일부가되지는 않을 것입니다.

    조금 도움이 되었기를 바랍니다.

  • +0

    아하! 마틴, 보이는 태그 집합이 어디에서 왔는지 정리 해줘서 고마워. 내 문제가 완전히 사라진다. 나는 지사에 관해서 당신의 요점을 말합니다. 즉, 지사에 지명을 부여 할 필요가 없다는 것입니다. 나의 직감은 익명의 가지가 혼란을 가져올 것이라는 것이다. (1.0을 기반으로하는 bugfix 변경 집합을 커밋 한 다음 다른 것으로 업데이트하면 어떻게 bugfix 줄로 돌아갈 수 있는가? 변경 집합 ID를 알 필요가 없습니까?), 물론 나는 실제로 이것을 실제로 시험해보아야한다. –

    +0

    맞습니다. 변경 ID를 알아야합니다. "hg heads"는이를 알려줄 수 있으며 북마크 확장은 그에게 이름을 부여 할 수 있습니다. 우리가 Mercurial 프로젝트 자체에서하는 것처럼 여러 클론을 사용하는 가장 쉬운 방법입니다. 거기에는 hg 및 hg 안정 클론과 버그 수정이 포함되어 있습니다. 명명 된 브랜치를 사용했을 수도 있습니다. hg/hg-stable 스킴이 사용 된 후에 오히려 명명 된 브랜치가 추가 되었기 때문에 우리는 그렇지 않습니다. –

    +3

    이제 Mercurial 프로젝트 자체에서 명명 된 분기를 사용합니다. 또한 북마크 확장은 이제 핵심 기능의 일부로, Mercurial 1.8로 업그레이드 한 후에는 항상 활성화된다는 것을 의미합니다. –

    1

    태그 지정 방법을 선택하는 데 이상한 부작용이 있지만 정확히 설명하면 this wiki입니다.또한 전체 repo를 복제 한 다음 관심 지점으로 업데이트하여 생성하는 데 사용 된 태그가 포함되지 않은 repo를 만들지 않도록하는 것이 좋습니다.