2010-03-23 3 views
23

Subversion에서 Mercurial로 이전 중입니다. 마이그레이션을 용이하게하기 위해 Subversion 저장소의 복제본 인 중간 Mercurial 저장소를 만듭니다. 모든 개발자는 Mercurial 저장소로 전환을 시작할 것이며 중간 Mercurial 저장소에서 기존 Subversion 저장소로 변경 사항을 주기적으로 푸시합니다. 일정 기간이 지난 후에는 Subversion 저장소를 폐기 할 것이고 중급 Mercurial 저장소는 새로운 기록 시스템이 될 것입니다.Mercurial에서 Mercurial to Subversion Workflow 문제

Dev 1 Local --+--> Mercurial --+--> Subversion 
Dev 2 Local --+    + 
Dev 3 Local --+    + 
Dev 4 -------------------------+ 

나는 이것을 테스트했습니다,하지만 난 내 로컬 저장소에서 변경을 누를 때 나는 중간 머큐리얼 저장소에, 문제로 실행 계속하고 위로 우리의 Subversion 저장소에. 내 로컬 컴퓨터에

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/01.png

, 나는 우리의 중간 머큐리얼 저장소에 푸시하기 위해 최선을 다하고 준비하는 변경 집합이있다. 여기

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/02.png

내가 원격 저장소 만이 변경 집합을 밀어 ... 그것은 해시 (625)와 수정 # 2263입니다 볼 수 있습니다.

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/03.png

지금까지, 모든 것이 좋아 보인다. 변경 집합이 푸시되었습니다.

hg update 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 

이제 원격 저장소로 전환하고 작업 디렉토리를 업데이트합니다.

hg push 
pushing to svn://... 
searching for changes 
[r3834] bmurphy: database namespace 
pulled 1 revisions 
saving bundle to /srv/hg/repository/.hg/strip-backup/62539f8df3b2-temp 
adding branch 
adding changesets 
adding manifests 
adding file changes 
added 1 changesets with 1 changes to 1 files 
rebase completed 

다음으로 변경 사항을 Subversion으로 푸시하면 멋지게 작동합니다. 이 시점에서 변경 사항은 Subversion 저장소에 있으며 나는 로컬 클라이언트에게 다시주의를 환기시킵니다.

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/04.png

나는 내 로컬 컴퓨터에 대한 변경 사항을 당깁니다. 응? 이제 두 개의 변경 집합이 생겼습니다. 원래의 변경 집합이 로컬 브랜치로 나타납니다.

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/05.png

다른 변경 집합은 새로운 개정 번호 2264, 새로운 해시 (10C1)을 가지고 ...

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/06.png

어쨌든, 나는 새로운 버전을 내 로컬 REPO를 업데이트합니다.

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/07.png

는 지금 전환하고있다.

alt text http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/08.png

그래서, 나는 마침내 클릭 "결정 나가는 변경 집합을 표시"하고 의욕을 볼 수 있듯이 여전히 그들은 이미 밀어 봤는데 비록 내 이전 변경 집합을 밀어 싶어.

분명히, 나는 잘못된 것을하고 있습니다.

또한 두 개의 리비전을 병합 할 수 없습니다.내 로컬 컴퓨터에서 두 개의 리비전을 병합하면 "병합"커밋이 끝납니다. Merge 커밋을 중간 Mercurial 저장소로 푸시 할 때 더 이상 Subversion 저장소로 변경 사항을 푸시 할 수 없습니다. 결국 다음과 같은 문제가 발생합니다.

hg update 
0 files updated, 0 files merged, 0 files removed, 0 files unresolved 

hg push 
pushing to svn://... 
searching for changes 
abort: Sorry, can't find svn parent of a merge revision. 

그리고 나는 병합을 롤백해야 작동 상태로 되돌아갑니다.

무엇이 누락 되었습니까?

+7

모든 이미지가 손상되었습니다. - \ –

답변

22

당신이보고있는 동작이 실제로 (새로운 Mercurial 사용자에게 다소 혼란 스럽다면) 결과라는 잘못된 상황은 아닙니다.당신은 노력하고

을 의욕하는

  • 변환 서브 버전 저장소 SVN의 외부 변화를 교환하지 않고, 서브 버전의 클라이언트로 의욕 사용

    1. :

      hgsubversion 두 가지에 대한 정말 좋은 좀 더 일반화 된 게이트웨이로 사용하는 것이 훨씬 더 어려운 문제입니다. Subversion은 세계에 대한 매우 견고한 견해를 가지고 있으며 그 안에서 작업해야합니다. 문제의 진실은 Subversion에서 개정판을 가져온 후에 hgsubversion을 사용할 때 개정 해시는 최종본으로 만 볼 수 있다는 것입니다. 따라서 개발자가 중개자로서 Subversion을 사용하지 않고 Mercurial 리포지토리간에 직접 변경 집합을 공유하는 경우이 문제가 발생합니다.

      rebase는 매우 근본적인 이유로 자동 및 비 선택적입니다. Subversion은 푸시 할 때 해당 rebase를 수행합니다. 푸시 할 때 unpulled 변경 사항이있는 경우 Subversion이 해당 rebase를 수행하고, 성공하면 (단순한 리베이스 재 지정 알고리즘을 사용하여) rebase가 발생했다는 표시없이 커밋을 허용합니다. 두 가지 모델을 함께 패치하고 있습니다.

      저는 모두를 Mercurial로 한꺼번에 이동하는 것이 좋습니다. 이렇게 하이브리드 방식을 사용하면 단기적으로는 Mercurial을 사용하기 어려워지고 DVCS를 처음 사용하는 사용자를 혼란스럽게 할 수 있습니다.

  • +2

    @dalroth는 다음과 같은 프로세스가 필요합니다. 사용자가 r1 : r2를 hg-gateway로 푸시하고 hg-gateway가 자동으로 서브 버전으로 푸시해야 사용자가 지금 당겨야하며 마지막으로 사용자가 'hg strip r1'이어야합니다. – Harvey

    +0

    @Harvey - 설명을 해줄까요? 나는 hg로 전환하고 싶은 팀을 가지고있다. 그러나 svn은 여기의 황무지를 지배한다. 마스터 hg repo를 설정하고 거기에서 master svn으로 푸시/당기기 만하면 모든 것이 괜찮습니까? 더 긴 버전 : 내 상사가 hg로 전환하는 것이 좋겠지 만 한 팀이 파일럿 프로그램을 먼저 수행하는 경우에만 가능합니다. 충분한 공통 코드가 있습니다. (빌드 머신이 여전히 svn을 실행 중임은 말할 것도 없습니다.) hg로 완전히 전환하는 것은 의문의 여지가 없습니다. – moswald

    +1

    @mos : 그게 효과가 있습니다, 사실 그것은 제가 개인적으로하는 일입니다. 트릭은 수정 된 hg <-> hgsubversion <-> svn workflow를 배우는 것입니다. 그것이 어떻게 작동하는지 "알게되면"아무런 문제가 없습니다. 몇 가지 명령 만 입력하면됩니다. 나는 실제로 반복적 인 과정을 쉽게하기 위해 스크립트를 작성하기 시작했다. 일반적인 흐름 : [ "hg"repo에서] 많은 변경 사항을 적용합니다. 그들을 "hgsubversion"에 밀어 넣으십시오; [ "hgsubversion"로 전환] hg update (hgsubversion 필요); hg "svn"으로 푸시 (변경 사항을 로컬에서 푸시하고 제거한 후 자동으로 다시 가져옵니다); ... 계속하려면 ... – Harvey

    3

    먼저, 이러한 세부적인 질문을 읽는 것이 얼마나 즐거웠는지 이야기하겠습니다. :)

    원격에서 svn repo에 hg push을 수행하면 문제가 발생합니다. 다음은 예로부터의 출력입니다 :

    hg push 
    pushing to svn://... 
    searching for changes 
    [r3834] bmurphy: database namespace 
    pulled 1 revisions 
    saving bundle to /srv/hg/repository/.hg/strip-backup/62539f8df3b2-temp 
    adding branch 
    adding changesets 
    adding manifests 
    adding file changes 
    added 1 changesets with 1 changes to 1 files 
    rebase completed 
    

    나는 HG-전복 사용자 아니에요,하지만 그 출력은 말한다 당신이, 그것은의 svn의 환매 특약의 변경을 당기는을 찾는 것 요청 푸시를하는 과정에서 새 버전을 만든 다음 새로 가져온 개정판 (자손) 이후에 변경 세트 10c1rebase을 수행하십시오. rebase command은 분기 히스토리를 가져와 선형 히스토리로 바꾸지 만, 이렇게하면 변경 세트의 부모가 변경되어 해시가 변경되며 이는 사용자에게 일어나는 것처럼 보입니다.

    당신 : 그 풀/REBASE는 항상 일이되어 그 작동하도록되어 있지만,이야 어떻게 hgsubversion 위키 페이지를 말합니다 경우 다시

    아닌 HG-서브 버전 사용자는, 그래서 나는 말할 수 없다 보통의 Mercurial 명령을 사용하여이 저장소에서 작업 할 수 있습니다. 당신이 주어진 분기에 커밋의 시리즈를 가지고 있고, 에 해당 분기의 끝으로 이동하려는의 HG를 사용하는 경우 는 --svn 명령을 리베이스하면서 끝 작업의 , 그 변경 집합에 것 새로운 업스트림 작업의 상단에 자동으로 리베이스됩니다 ( ).

    정상적으로 자동으로 소리가 나지 않습니다.

    나는 당신의 소개에서 확실히 말할 수 없었고, 새로운 changesets은 여전히 ​​svn에서 생성 되었습니까? 아니면 수은에서만 생성 되었습니까?

    수은으로 만든 경우 원격 시스템에서 svn-gateway repo를 설정하고 그곳에서 밀어 넣기 만하면됩니다. 그런 다음 repo에서 다시 수은으로 가져 오지 마십시오. 그런 다음 해당 repo의 changesets는 rebase로 인해 다른 hashids를 갖지만 주 원격 리포 및 최종 사용자 시스템으로 다시 흐르지 않습니다.

    더 큰 문제는 "hg push svn : // ..이 모든 아웃 바운드 변경 집합을 리베이스하고있는 이유"를 파악하는 것입니다. 그 중 하나에 응답하고 동작이 중지됩니다.

    +0

    나는 이것을 더 가까이에서 보았지만 여전히 운이 없습니다. 자동으로 rebase를 수행하지 않고 중간 저장소에서 hg하는 방법을 찾을 수 없으며 hg rebase --svn은 이미 최신 버전이기 때문에 아무 것도하지 않습니다. – bmurphy1976

    +0

    그래, 왜 hb-subversion 친구들에게 rebase를하고 있는지, 그리고 피할 수 있는지에 대해 이야기하십시오. 나는 workarounds (3 repo 해결책이하는)를 위해서만 좋은 것을 두려워한다. –

    +0

    @Dalroth, @ Ry4an : hgsubversion은 전복이있는 단점 때문에 rebase를 수행해야합니다. 궁극적 인 해결책은 hgsubversion 복제본의 hg 복제본을 만들 때 hgsubversion이이를 탐지 할 수 있는지 여부입니다. 그런 다음 필요한 다운 스트림 스트립 및 리베이스를 자동으로 수행합니다. 나는 직장에서이 과정을 사용한다. 그것은 효과가 있지만 익숙해 져야합니다. hgsubversion 복제본이 자동으로 Subversion 서버와 함께 최신 상태로 유지되지 않으면 SVN에서 가져온 내용을 새 팁으로 리베이스해야하기 때문에 더 복잡해집니다. – Harvey

    1

    이제 이와 비슷한 작업을하기 위해 graft 명령을 사용하고 있습니다. 효과적으로 우리는 모든 변경 집합을 밀어 넣기 전에 병합 변경 집합을 밀어 넣지 않아도되도록 만듭니다.

    우리의 목표는 전복을 사용하는 프로젝트에 깔끔하게 기여하는 것입니다.

    • 모든 변경 사항에 대해 서브 버전 분기를 만듭니다. Mercurial에 넣으십시오.
      $ cd [svn-checkout] ; svn cp trunk branches/hg-bridge
      $ cd [hgsubversion bridge] ; hg pull ; hg update hg-bridge

    • 새로운 변화
      해당 지역의 repo를 확인 $ hg in [repo] # shows <rev> IDs you can use later

    • 로컬의 repo에서 svn을에 들어가 원하는대로 변경 당겨
      $ hg pull [repo]

    • 공헌 할 모든 변경 사항 이식 :
      $ hg graft [rev] [rev] # rev could be 645 or b7a92bbb0e0b. Best use the second>.
      당신은 개별적으로
      을 모든 회전을 지정해야하지만 당신은 하나의 명령으로 여러 회전 속도를 올린다을 접목 할 수 있습니다.당신이 밀어 것입니다 무슨

    • 확인 :
      $ hg outgoing

    • 를 눌러 변경 :
      $ hg push
      는 어떤 관련이없는 뽑아 개정
      새 버전으로 표시되어야 보여 (필요하지 않아야하는) 백업 번들에 대한 경로와 함께
      을 사용할 수 있습니다 (주석도 사용할 수 있습니다. GPLv2 이후 버전)