2010-08-17 5 views
3

최근에 Mercurial을 사용하기 시작했고 중앙 저장소에 체크인하지 않고 개인 개발을 위해 VCS 보호 기능을 사용하는 것과 같은 방식으로 중앙 저장소로 이동합니다. 나머지 팀.Mercurial은 로컬 저장소에서 중앙 저장소로 메시지를 보냅니다.

내가 "hg commit"할 때 마지막 커밋 이후에 덧셈과 관련된 커밋 메시지를 씁니다. 내가 중앙에 물건을 밀어 넣기 전에 5 개 정도의 지역 커밋을 할 수 있습니다. 내가 푸시 할 때 개정을 지정하지 않으면 모든 로컬 커밋과 메시지가 중앙 저장소에 추가되지만 모든 로컬 작은 단계로 중앙 로그를 어지럽히고 싶지는 않습니다. 내가 로컬 리비전을 밀고 지정할 때, 리비전과 커밋 메시지 만 푸시됩니다.

문제는 로컬에있는 모든 "오프라인"작업을 요약하는 커밋 메시지로 푸시하고 싶습니다. 왜냐하면 이것이 내가 실제로 추가 한 작업이기 때문입니다. 그러나 푸시 된 커밋 메시지는 내가 가장 최근에 쓴 것입니다. 기능 A에 대해 작업 중이며 5 개의 로컬 커밋이 있습니다. "A.1 추가" "A.2 추가" "foo.cpp의 코드 정리"등으로 끝나며 "A.4 추가" 내가 을 중앙 저장소에 기록하려면 "추가 된 A, foo.cpp 정리"가 필요하지만 마지막 개정판을 누르면 "A.4 추가"가 표시됩니다. 이제, 중앙에 업데이트가있을 때 밀기 전에 로컬로 병합해야합니다. 로컬 커밋 메시지는 "병합 된 팁"입니다. 분명히 그것은 뒤로 미루는 좋은 커밋 메시지가 아닙니다.

여기에 좋은 연습이 무엇입니까? 나는 기존의 커밋 메시지를 변경하거나 새로운 커밋 메시지로 푸시하는 메커니즘을 알지 못합니다. 변경하기 전에 새로운 커밋 메시지를 입력하기 만하면 로컬 레포에 사소한 변경을하고 싶지 않습니다. 그건 바보 야. 이것이 기본적으로 보이기 때문에 나는 뭔가를 놓치고 있어야합니다. 아니면 나는 수은을 제대로 생각하지 않습니까?

답변

1

다섯 개의 변경 집합을 밀어 넣는 것은 완벽하게 허용되며 다른 사람들이 코드를 검토하는 것을 더 쉽게 만듭니다. 논리적으로 일관성있는 변경 집합을 만들려고 노력하십시오. 나는 대개 코드가 컴파일되고 커밋 된 후에 테스트를 통과하도록 보장하려고 노력한다.

는 사후 변경 집합을 변경할 수 있도록 몇 가지 확장 (collapse, rebase, histedit, mq)이 있습니다. collapse 확장은 여기에서 원하는 것입니다. 다섯 개의 로컬 변경 집합을 단일 변경 집합으로 축소 (결합)하여 서버로 보낼 수 있습니다.

새로운 변경 집합을 만들고 이전 변경 내용을 버리면 변경 집합이 만들어집니다. 이로 인해 개인용 변경 집합 (즉, 다른 사용자와 아직 공유되지 않은 변경 집합)에서만 사용해야합니다.

우연히 이미 중앙 저장소로 푸시 된 변경 집합을 변경 한 경우 아무런 재앙이 발생하지 않습니다. 원래의 변경 집합과 변경된 변경 집합으로 끝날 것입니다. 이는 hg push이 추가 전용이기 때문에 중앙 저장소로 푸시 된 변경 집합을 변경할 수 없기 때문입니다.

+0

"붕괴"가 실제로 내가 찾고있는 것 같아서이 솔루션을 선택했습니다. 그것은 제가 로컬에서 만든 약간의 개선을 포기하고 저의 커밋을하게하고, 업데이트를 공유하기 전에 하나 이상의 포괄적 인 변경 세트로 정리할 것입니다. 어떤 경우에는 수은의 병합을 약화시킬 수 있다는 것을 깨닫습니다. 더 이상 모든 걸 취하지 않으면 조심하겠습니다. 고맙습니다. – jasper77

1

저는 Mercurial이 그 기능 집합의 형태를 지원한다고 생각하지 않습니다. 이 문제를 해결하는 가장 좋은 방법은 다음과 같습니다.

1) 변경이 끝나면 중앙 저장소를 새 폴더에 복제하십시오.
2) 원래 작업 저장소에서 모든 변경 사항의 패치 파일을 내 보냅니다.
3) 새로 복제 된 pristine 폴더로 패치 파일을 가져옵니다.
4) 새로 변경된 폴더에서 모든 변경 내용을 한 번에 적용하고 변경 내용을 적용합니다.

이러한 단계를 수행하는 스크립트를 만드는 것이 너무 어렵지 않아야합니다!

+0

복제본이 ssh를 넘어 스크립트가 대화 형이어야 할 필요가 있지만이 접근 방식이 작동하는 것처럼 보입니다. 감사! 이것은 일반적으로 받아 들여지는 사용 모델이 아닌가? – jasper77

1

리비전을 푸시하고 지정하면 다른 리포지토리에없는 해당 리비전의 조상이 모두 푸시됩니다. 변경 집합이 이전의 변경 집합에 따라 다르면 아마도 이것은 원하는 동작 일 것입니다.

하나의 changset을 보내고 싶으면 (그리고 그 조상과 독립적입니다) 로컬 기록을 재정렬 할 수 있으므로 보낼 변경 세트가 조상입니다. histedit extension으로 허용됩니다. 로컬 변경 사항을 압축하여 단일 변경 집합으로 보내려면 histedit을 사용하여이를 "접을"수 있습니다.

"병합"메시지가 많이 발생하는 문제를 해결하려면 중앙 저장소에서 당길 때 rebase 로컬 변경이 가능합니다. 결과는 변경 사항에 최신 변경 사항이 적용되며 개발 내역은 선형입니다.

대기열은 (좋은/보편적 인) 솔루션이지만 약간 다른 문제점 (다른 저장소와의 패치 유지)을 해결하도록 설계되었습니다. 물론 mq 확장자를 사용하지 않았다고 말합니다. 정말로 원하는 것이 중앙의 것과 다른 로컬 기록 (예 : 모든 로컬 메시지 유지)을 가지고 있다면 큐는 내가 아는 유일한 해결책입니다.

관련 문제