Mercurial Repository와 Git 상호 운용성


195

Mac에서 GIT을 사용합니다. 충분했다. 도구가 있고 경험이 있습니다. 그리고 나는 그것을 계속 사용하고 싶습니다. 여기에 전쟁이 없습니다 ...

문제는 항상 상호 운용성입니다. 대부분의 사람들은 SVN을 사용합니다. Git SVN은 기본적으로 작동하며 주름없는 솔루션입니다. 사람들은 계속해서 행복하게 SVN을 사용할 수 있으며 워크 플로와 도구를 잃지 않습니다.

자 ... 일부 사람들은 Mercurial과 함께옵니다. 그들에게 좋습니다 : 그들은 이유가 있습니다. 그러나 즉시 사용할 수있는 GIT HG를 찾을 수 없습니다. HG로 전환하고 싶지 않지만 여전히 저장소와 상호 운용해야합니다.

당신들 중 누구라도 이것에 대한 간단한 해결책을 알고 있습니까?


4
hg-git은 양방향으로 작동합니다.
Derek Mahar

1
@dubiousjim의 답변은 유지 관리되지 않은 repos를 가리 키거나 오래된 조언을 제공하는 현재 상위 2 개보다 더 유용하고 포괄적이며 최신입니다. 그러나이 질문에 대한 더 많은 업데이트가 매우 도움이 될 것입니다.
nealmcb

답변:


60

2012 년 6 월 업데이트. 현재 개발자가 git 쪽에서 작업하려고 할 때 Git / Hg 상호 운용성을위한 다음과 같은 방법이 있습니다.

  1. Mercurial 및 hg-git 확장을 설치하십시오 . 패키지 관리자를 사용하거나을 사용하여 후자를 수행 할 수 있습니다 easy_install hg-git. 그런 다음 ~ / .hgrc에 다음이 있는지 확인하십시오.

    [extensions]
    hggit = 
    

    bookmarks여기 에서 확장명을 지정하는 것에 대한 언급이 있지만 v 1.8 이후 Mercurial에 내장되어 있습니다. 다음은 Windows에서 hg-git 설치에 대한 팁 입니다.

    hg-git이 있으면 위에 게시 된 Abderrahim Kitouni 와 같은 명령을 사용할 수 있습니다 . 이 방법은 2009 년 이후 개선되고 조정 되었으며 친숙한 래퍼 ( git-hg-again)가 있습니다. 최상위 디렉토리를 Mercurial과 Git의 작업 디렉토리로 동시에 사용합니다. defaultMercurial 저장소 의 (이름이없는) 브랜치 끝과 동기화 된 Mercurial 책갈피를 작성하고 해당 책갈피에서 로컬 Git 브랜치를 업데이트합니다.

  2. git-remote-hg 는 Mercurialhg-git확장을기반으로하는 다른 래퍼입니다. 이것은 또한git-remote-helpers프로토콜 (따라서 그 이름)을 사용합니다. Git 작업 디렉토리에 대해서만 최상위 디렉토리를 사용합니다. Mercurial 저장소를 노출시키지 않습니다. 또한 Git과 Mercurial 간의 동기화를보다 안전하고 관용적으로 gitlike로 만들기 위해 두 번째 베어 Git 저장소를 유지 관리합니다.

  3. 자식-HG의 스크립트 (이전의 유지 여기가 )에 따라 다른 방법을 사용 hg-fast-export로부터 빠른 속도로 수출 프로젝트를 . 방법 2와 마찬가지로 베어 Mercurial 저장소와 추가 베어 Git 저장소도 유지합니다.

    당기기 위해이 도구는 Mercurial 책갈피를 무시하고 대신 이름이 지정된 모든 Mercurial 분기를 Git 분기로 가져오고 기본 (이름이없는) Mercurial 분기를 마스터로 가져옵니다.

    일부 해설> 자식뿐 아니라 그것이 내가 설명해 년 12 2011 년 7 git-> HG 푸시 지원 합병했다고 주장 hg- 인 것으로이 도구에 대해 설명 이러한 도구의 검토 , 방법,하지만이 도구의 시도가 구현을 푸시 지원이 작동하지 않는 것 같습니다.

  4. git-remote-hg라는 다른 프로젝트 도 있습니다 . 위에 나열된 버전과 달리이 버전은 hg-git에 의존하지 않고 Mercurial Python API에 직접 액세스합니다. 현재이를 사용하려면 패치 버전의 git이 필요합니다. 아직 시도하지 않았습니다.

  5. 마지막으로 Tailor 는 다양한 VCS간에 점진적으로 변환하는 프로젝트입니다. 이것의 개발이 적극적으로 진행되지 않을 것 같습니다.

이러한 접근법 중 처음 세 가지 방법은 조사를 설득하기에 충분히 가벼워 보였다. 설정에서 실행할 수 있도록 몇 가지 방법으로 조정해야했고, 개선하기 위해 더 조정하는 방법을 보았습니다. 그런 다음 평가를 위해 서로 더 행동하도록 더 조정했습니다. 더 효과적으로. 그런 다음 다른 사람들도 동일한 평가를 수행하기 위해 이러한 조정을 원한다고 생각했습니다. 따라서 처음 세 가지 도구 중 하나를 내 버전으로 설치할 수 있는 소스 패키지만들었습니다 . 또한 필요한 hg-fast-export부품 을 설치해야 합니다. ( hg-git자체적 으로 설치해야합니다 .)

나는 당신이 그들을 시도하고 가장 잘 작동하는 것을 스스로 결정하도록 권장합니다. 이 도구가 깨지는 경우에 대해 기뻐할 것입니다. 나는 그것들을 업스트림 변경 사항과 동기화하고 업스트림 작성자가 내가 생각하는 유용한 조정을 인식하도록 노력할 것입니다.

위에서 언급했듯이 이러한 도구를 평가할 때 git-hg푸시가 아닌 Mercurial에서 가져 오기에만 사용할 수 있다는 결론에 도달했습니다 .

이와 관련하여 Git과 Mercurial 간의 유용한 비교 / 번역 매뉴얼은 다음과 같습니다. 일부 경우 이미 Git을 알고있는 사용자를 대상으로합니다.


2
방법 2를 직접 사용하거나 조정 된 버전을 사용하고 있습니다. 전반적으로 그것은 (내가 시도한 것 중) 가장 안정적이고 유연한 접근 방식으로 보입니다. 자세한 내용은 리뷰 / 소스 패키지에 대한 링크를 참조하십시오.
dubiousjim

예. 킬른 하모니는 대단합니다. 솔로 개발자에게는 무료입니다.
CAD bloke

114

기본 지원을 제공하는 새로운 git-remote-hg가 있습니다.

Mercurial 및 Bazaar를위한 Git의 브릿지 지원

git-remote-hg 를 $ PATH에 복사 하고 실행 가능하게 만드십시오. 그러면 종속성이 없습니다 (Mercurial 제외).

git clone hg::https://www.mercurial-scm.org/repo/hg/

마치 기본 Git 리포지토리 인 것처럼 밀어 넣을 수 있습니다.

새로운 Git 브랜치를 누르면 Mercurial 북마크가 생성됩니다.

자세한 정보는 git-remote-hg 위키 를 참조하십시오.


14
안녕 펠리페, 그건 사실이 아니에요, 당신은 의존성으로 작동하는 수은 버전이 필요합니다
Antoine Pelisse

5
이름을 정확하게 지정하십시오 git-remote-hg(즉, .py접미사 없음 ).
schmmd

3
hg 저장소가 하위 모듈 일 때도 작동합니다.
Clayton Stanley

4
python 2가 필요합니다. 따라서 python 3이 시스템의 기본값 인 경우 (또는 데비안을 실행하지 않고 향후 증명을 원할 경우) 첫 줄을로 변경하십시오 #!/usr/bin/env python2.
Kevin Cox

4
Mercurial 3.2 @FelipeC의 git-remote-hg는 더 이상 작동하지 않으므로 ( github.com/felipec/git-remote-hg/issues/27 ) 문제를 해결하는 포크가 병합 될 때까지 ( github 참조) .com / fingolfin / git-remote-hg )
Cimbali

106

hg-git 을 사용할 수 있어야합니다 .

hg clone <hg repository>

편집 ~/.hgrc및 추가 :

[extensions]
hgext.bookmarks =
hggit =

북마크를 만들면 mastergit 안에 있습니다 :

cd <repository>
hg bookmark -r default master

.hg/hgrc저장소에서 편집 하고 추가하십시오.

[git]
intree = true

이제 git 저장소를 만들 수 있습니다 :

hg gexport

결과 디렉토리를 git clone으로 사용할 수 있습니다. 수은에서 당기는 것은 다음과 같습니다.

hg pull
hg gexport

그리고 수은으로 밀기 :

hg gimport
hg push

(예,이 워크 플로에서 hg를 사용해야하지만 해킹은 모두 git에 있습니다)

추신이 워크 플로에 문제가 있으면 버그를 신고하십시오.


3
easy_install hg-git을 먼저 실행하는 것을 잊지 마십시오
Christian Oudard 2009

1
내가 원하는 바는 아니지만 여전히 가능합니다. 감사.
Hugo Sereno Ferreira

3
단지 한 번은 로컬 hg 저장소 에서이 프로세스를 한 번 실행 한 후 잘못된 것을 수행 한 결과 git을 사용하여 결과 저장소를 복제 할 수 없었습니다. 소스 hg 저장소를 "hg 복제"하고 새 hg 저장소의 단계를 수행 한 다음 새 hg 저장소를 git 복제해야했습니다.
Rocky Burt

1
git status$ git status fatal 명령을 실행 하려고 할 때이 작업을 수행합니다.이 작업은 작업 트리에서 실행해야합니다. 이것은 hg gexport새로 복제 된 hg 저장소에서 발행 한 후 입니다. 베어 리포지토리를 해결할 수있는 방법은 무엇입니까? 업데이트 . Rock Burt의 제안은 분명히 작동합니다. 감사합니다
yesudeep

1
@ThaDon 같은 문제가 있습니다. 분명히 git repo는 .hg / git로 생성됩니다. 해결책은 'ln -s .hg / git .git'입니다.
mb14

15

http://repo.or.cz/w/fast-export.githg2git 에서 찾을 수있는 python 스크립트이며 빠른 내보내기의 일부인을 사용해보십시오 .

그래도 수은이 설치되어 있어야합니다.


4
이것은 hg repo를 git repo로 변환했습니다. 대단히 감사합니다!
reconbot

이 스크립트는 나를 위해 실패했지만 원래는 hg-fast-export괜찮 았는데
안드레이

나는 현재 hg-fast-export스크립트가에 전달 한다고 생각합니다 hg2git. 나는 그것을 모두 추적하지 않았습니다. 이 도구는 Hg-> Git에서만 가능하지만 그 반대는 아닙니다.
dubiousjim 2016 년

9

HG-자식이 때문에 웨이 브리지, 그것은 또한 당신이 의욕에 힘내에서 변경 집합을 밀어 수 있습니다.


6

수은 - 힘내 의욕 플러그인 . 직접 시도하지는 않았지만 체크 아웃 할 가치가 있습니다.


7
이것은 수은 사용자가 다른 방법이 아닌 git repos를 밀고 당길 수있게하는 플러그인입니다. 이것은 OP가 원하는 것입니다.
sykora

1
@sykora, 그것은 역방향에서 상호 운용성을 구동하는 데 사용될 수 있습니다. 내 답변에 나열된 도구 중 일부를 참조하십시오.
dubiousjim 2016 년

6

https://github.com/cosmin/git-hggit-hg 에서 큰 성공을 거두었습니다 (작업 설치도 필요합니다 ). 가져 오기, 당기기 및 푸시를 지원하며 (유사한 기능에서 git까지) 보다 안정적입니다 .hghg-githg

사용 예는 https://github.com/cosmin/git-hg#usage 를 참조 하십시오 . 사용자 인터페이스는와 매우 유사합니다 git-svn.

git-hg복제 된 각 hg 저장소에 추가 디스크 공간 이 필요합니다. 구현에는 전체 수은 클론, 추가 git bare 클론 및 실제 git repo가 ​​사용됩니다. 필요한 디스크 공간은 일반적인 자식 전용 사용량의 약 3 배입니다. 추가 사본은 .git작업 디렉토리 의 디렉토리 아래 (또는 GIT_DIR평소와 같이 가리키는 위치 )에 저장됩니다.

주의 사항 : 것을 기본적인 문제 git-hg1 매핑 사이 : 시도를 해결하기 위해 어떤 일이 없다는 것이다 githg기능을 제공합니다. 가장 큰 문제는 자식 지점 사이의 임피던스 부정합이다 HG 이름이 나뭇 가지HG라는 이름의 지점HG 북마크 (그보기의 모든 지점과 같은 많은 git사용자). 관련된 문제는 hg기본적으로 지점 커밋 메시지 만 템플릿 커밋 메시지에 추가되는 git과는 달리 버전 기록에 원래 이름의 분기 이름을 저장하려고 시도한다는 것입니다.

주장 사이의 상호 운용 다리를 만들 수 있음을 모든 도구 githg가이 임피던스 매칭을 다루는 것 방법을 설명한다. 그런 다음 선택한 솔루션이 필요에 맞는지 결정할 수 있습니다.

사용하는 솔루션 git-hg은 모든 hg 책갈피를 버리고 명명 된 분기를 자식 분기로 변환하는 것입니다. 또한 git master 브랜치를 기본 이름이없는 hg 브랜치로 설정합니다.


그것은 git-hgHg에서 당기는 것이 아니라 실행 가능한 것처럼 보입니다 (내 대답에서 링크 된 설명 참조). 양방향으로 성공적으로 사용하는 방법을 찾았습니까? 여분의 공간과 관련하여 내가 알고있는 모든 기술에는 dir + 1 개의 git db / metadata + 1 개의 hg db / metadata 사본이 있습니다. git db / metadata의 두 번째 사본을 추가하면 더 많은 디스크 사용량이 필요하지만, 상대적으로 말하면 그렇게 나쁘지는 않습니다.
dubiousjim 2016 년

@dubiousjim 내 요구는 풀 / 페치로 가득 차 있었고 실제로 푸시를 테스트하지 않았습니다. 나는 문서를 신뢰했지만 설명을 확인한 후에 git-hg는 푸시하기에 적합하지 않다고 생각합니다 . 나는 push충분히 안정적이지 않은 것을 명확히하기 위해 대답을 수정했습니다 .
Mikko Rantalainen

너무 나쁘지만, 내가 보지 못한 푸시를 성공적으로 사용하는 방법이있을 것이라고 생각했습니다.
dubiousjim

1
임피던스 불일치 및 찾아야 할 사항을 강조하기위한 +1
matt wilkie

3

hggit을 시도했습니다. 나는 git'ers와 hg'ers의 작업에 대처해야하기 때문에 나를 위해 일합니다. 특히 리뷰의 경우 이것은 좋습니다.

해당 주제에 대한 사소한 문제 / 경고 :

hg를 사용하여 안정적인 Linux 커널 저장소를 복제하려고했습니다. 이 리포지토리는 git으로 유지 관리되며 일반적으로 많은 수의 파일이 있습니다.

매우 느렸다. 작업 사본 을 완전히 복제 하고 업데이트하는 데 2 일이 걸렸습니다 .


점점 좋아지고있는 것 같습니다. – 약 6 시간 동안 결제가 진행되었으며 9 시간 밖에 남지 않았다고합니다.
David Given

다시 가져갑니다. 현재 약 25 시간 동안 운영되고 있으며 여전히 9 개 밖에 남지 않았다고 주장합니다. 이틀 이요?
David 주어진

1
나는 첫 경험이 전혀 효과가 없다고 생각했다-나는 그것이 버그라고 가정하지만, 두 번째 시도에서 더 이상 분석하지 않았다. 업데이트 된 hg-git으로 내 Mac Book에서 거의 50 시간이 걸렸다. Pro (2.66GHz, 8 기가 RAM)
Wizz

지금 39 시간이다. 그래서 단지 11는 가고있다! 쿼드 코어 AMD Phenom. 그것은 되어 나는 그것을 실행시키는거야 이유입니다, 진전 (HG는 진행률 표시 줄 확장이입니다 반드시있다). 하나의 CPU를 페깅하고 전혀 CPU를 사용하지 않고 많은 디스크 액세스를 수행하는 것입니다.
David 주어진

커널 크기의 프로젝트로 인해 성능이 저하 hggit되거나 사용하기에 hg너무 느린 지 테스트 한 사람 이 있습니까?
Mikko Rantalainen

1

나는 mutt의 hg repo 에서 cosmin의 git-hgabourget의 git-hg-again을 모두 시도했지만 나중에 병합 순서를 잘 존중하는 것 같습니다. 아래 스크린 샷에서 볼 수 있습니다.

cosmin의 git-hg가 가져온 mutt의 병합 히스토리 그래프 :

여기에 이미지 설명을 입력하십시오

abourget의 git-hg-again이 가져온 mutt의 병합 히스토리 그래프 :

여기에 이미지 설명을 입력하십시오

mutt의 hg 저장소에 hgk로 표시 한 실제 히스토리 그래프 :

여기에 이미지 설명을 입력하십시오

위에서 볼 수 있듯이 abourget의 git-hg-again에 의한 두 번째 그래프 는 원래 hgk 그래프와 매우 가깝고 실제로 mutt의 실제 워크 플로우를 반영합니다.

내가 찾은 git-hg-again의 한 가지 단점은 'hg'원격을 추가하지 않고 모든 참조를 로컬 태그로 가져 오는 것입니다 .git-hg는 멋진 'hg'원격이 업스트림 hg 저장소를 나타냅니다.


1
cosmin과 abourget에 의한 버전 간의 차이점은 병합 커밋의 부모 순서입니다. 좋은 기록 시각화 도구 (예 gitk:)는 두 기록을 동일하게 렌더링 할 수 있어야합니다. 명백하게 누락 된 것은 hg/stableabourget에 의한 버전 의 브랜치 입니다. 나는 그것이 Mercurial의 명명 된 지점, unamed 지점 및 책갈피 사이의 문제라고 생각합니다.
Mikko Rantalainen

0

Git-hg Mirror 서비스를 통해 양방향 hg-git (및 git-git, hg-hg) 동기화도 가능합니다 . 그것은 배후에서 hg-git (다른 것들 중에서)을 사용하며 코드는 오픈 소스입니다.


면책 조항 : 나는 그 뒤에 회사에서 왔어요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.