MercurialリポジトリとのGit相互運用性


195

MacでGITを使用しています。十分に言った。私には道具があり、経験があります。使い続けたいです。ここには戦争はありません...

問題は常に相互運用性にあります。ほとんどの人がSVNを使用しています。これは私にとって素晴らしいことです。Git SVNはそのまま使用でき、簡単なソリューションではありません。人々は引き続きSVNを快適に使用でき、ワークフローもツールも失うことはありません。

今... Mercurialに同行する人もいます。彼らにとって罰金:彼らには理由があります。しかし、GIT HGをすぐに見つけることはできません。HGに切り替えたくありませんが、リポジトリと相互運用する必要があります。

皆さん、これの簡単な解決策を知っていますか?


4
hg-gitは双方向で動作します。
Derek Mahar、2011

1
@dubiousjimによる回答は、メンテナンスされていないリポジトリを参照したり、古くなったアドバイスをしたりしている現在の上位2つよりも、有用で包括的で最新のものです。しかし、この質問に関するさらに多くの更新は非常に役に立ちます。
nealmcb 2016

回答:


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にするために、2番目の裸のGitリポジトリーも維持します。

  3. gitの-HG(旧維持スクリプトここでは)に基づいて、異なる方法を使用していますhg-fast-exportから、高速輸出プロジェクト。方法2のように、これもMercurialの裸のリポジトリと追加のGitの裸のリポジトリを保持します。

    プルの場合、このツールはMercurialブックマークを無視し、代わりにすべての名前付きMercurialブランチをGitブランチにインポートし、デフォルトの(名前のない)Mercurialブランチをマスターにインポートします。

    一部の解説では、このツールをhg-> gitのみとして説明していますが、 2011年12月7日にgit-> hg pushサポートにマージされたと主張しています。これらのツールのレビューで説明しいるように、このツールが実装しようとする方法プッシュサポートは機能していないようです。

  4. git-remote-hgと呼ばれる別のプロジェクトもあります。上記のバージョンとは異なり、これはhg-gitに依存せず、代わりにMercurial Python APIに直接アクセスします。現時点では、パッチを適用したバージョンのgitも必要です。私はまだこれを試していません。

  5. 最後に、Tailorは、さまざまな異なるVCS間で段階的に変換するプロジェクトです。この開発は積極的に続けられないようです。

これらのアプローチの最初の3つは、調査を説得するのに十分なほど軽量に見えました。私はそれらを私のセットアップで実行させるためにいくつかの方法でそれらを微調整する必要がありました、そして私はそれらを改善するためにそれらをさらに微調整するいくつかの方法を見ました。それらをより効果的に。次に、他の人も同じ評価を行うために、これらの微調整もしたいと思うかもしれません。そこで、最初の3つのツールのいずれかのバージョンをインストールできるようにするソースパッケージを作成しました。また、必要なhg-fast-export部分のインストールも処理します。(hg-git自分でインストールする必要があります。)

それらを試して、何が最も効果的かを自分で決めることをお勧めします。これらのツールが壊れるケースについて聞いてうれしいです。私はそれらをアップストリームの変更と同期させておき、アップストリームの作者が私が有用だと思う微調整を確実に認識できるようにします。

上で述べたように、これらのツールを評価する際にgit-hg、Mercurialからのプルにのみ使用でき、プッシュには使用できないという結論に達しました。

これに関連して、GitとMercurialの間の有用な比較/翻訳マニュアルを以下に示します。場合によっては、すでにGitを知っているユーザーを対象としています。


2
私は方法2を自分で使用しているのですが、それよりも微調整したバージョンを使用しています。全体的に見て、(私が試したものの)最も信頼性が高く柔軟なアプローチです。詳細については、私のレビュー/ソースパッケージへのリンクを参照してください。
dubiousjim 2012

うん。キルンハーモニーは素晴らしいです。ソロ開発者も無料。
CADは2013年

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 wikiを参照してください。


14
ちょっとフェリペ、それは正確ではありません、依存関係として水銀の作業バージョンが必要です
Antoine Pelisse

5
正確な名前を付けてくださいgit-remote-hg(つまり、.pyサフィックスを付けないでください)。
schmmd 2013年

3
hgリポジトリがサブモジュールでもある場合に機能します。
クレイトンスタンレー

4
python 2が必要であることに注意してください。システムのデフォルトがpython 3である場合(またはDebianを実行しておらず、将来を見据えたい場合)、最初の行をに変更し#!/usr/bin/env python2ます。
ケビンコックス

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クローンとして使用できます。水銀から引っ張ることになるでしょう:

hg pull
hg gexport

と水銀にプッシュ:

hg gimport
hg push

(はい、このワークフローでhgを使用する必要がありますが、ハッキングはすべてgitで行われます)

PSこのワークフローに問題がある場合は、バグを報告してください。


3
最初にeasy_install hg-gitを実行することを忘れないでください
Christian Oudard

1
私が欲しかったものではありませんが、それでも実行可能です。ありがとう。
Hugo Sereno Ferreira、

3
ただfyiで、ローカルのhgリポジトリでこのプロセスを1回実行した後(そして何か間違ったことをした後)、gitを使用して結果のリポジトリを複製できませんでした。ソースhgレポを「hgクローン」し、新しいhgレポの手順に従って、新しいhgレポをgitクローンする必要がありました。
ロッキーバート

1
git statusコマンド$ git status fatal を発行しようとすると、これが表示されます。この操作はワークツリーで実行する必要がありhg gexportます。これは、新しくクローンしたhgリポジトリでを発行した後です。裸のリポジトリを回避するために可能な作業は何ですか? アップデート。どうやら、ロックバートの提案は機能します。ありがとう
yesudeep

1
@ThaDon同じ問題があります。どうやらgitリポジトリは.hg / gitとして作成されています。解決策は 'ln -s .hg / git .git'です。
mb14

15

を試すことができますhg2git。これはpythonスクリプトであり、高速エクスポートの一部であり、http://repo.or.cz/w/fast-export.gitにあります。

ただし、Mercurialをインストールする必要があります。


4
これにより、hgリポジトリがgitリポジトリに変換されました。ありがとうございました。
10

このスクリプトは私のために失敗したが、元はhg-fast-exportうまく働いた
アンドレイ

現在、hg-fast-exportスクリプトはにディスパッチすると思いますhg2git。私はそれをすべて追跡していません。これらのツールはHg-> Gitからの移動のみを許可し、その逆は許可しないことに注意してください。
dubiousjim

9

HG-のgitがあるので、2つの -wayブリッジ、それはまた、あなたがMercurialのにGitリポジトリからチェンジセットをプッシュすることができます。


6

Hg-Git Mercurialプラグイン。自分で試したことはありませんが、チェックする価値があるかもしれません。


7
これは、Mercurialユーザーがgitリポジトリからプッシュおよびプルできるようにするプラグインであり、逆ではありません。これはOPが求めていることです。
sykora 2009年

1
@sykora、逆方向からの相互運用性を促進するためにも使用できます。私の回答にリストしたツールのいくつかをご覧ください。
dubiousjim

6

私はhttps://github.com/cosmin/git-hggit-hgから大成功しました(のインストールも必要です)。それはフェッチ、プル、プッシュをサポートし、私よりも安定しています(からgitへの同様の機能)。hghg-githg

使用例については、https://github.com/cosmin/git-hg#usageを参照してください。ユーザーインターフェイスはに非常に似ていgit-svnます。

git-hgは、複製されたhgリポジトリごとに追加のディスク領域が必要です。実装では、完全なmercurialクローン、追加のgit bareクローン、および実際のgitリポジトリを使用します。必要なディスク容量は、通常のgit onlyの使用量の約3倍です。追加のコピーは.git、作業ディレクトリのディレクトリ(またはGIT_DIR通常どおりにポイントされる場所)の下に保存されます。

通知:git-hg解決しようとする基本的な問題は、githg機能の間に1対1のマッピングがないことです。最大の問題は、gitブランチとhg名前なしブランチhg名前付きブランチhgブックマークの間のインピーダンスの不一致です(これらはすべて、gitユーザーにとってはブランチのように見えます)。関連する問題は、hgデフォルトではブランチ名がテンプレートのコミットメッセージにのみ追加されるgitではなく、バージョン履歴に元の名前付きブランチ名を保存しようとすることです。

クレームは間の相互運用性のブリッジを作成することを任意のツールgithg、このインピーダンス整合に対処するために起こっているのかを説明する必要があります。次に、選択したソリューションがニーズに合っているかどうかを判断できます。

git-hg使用するソリューションは、すべてのhgブックマークを破棄し、名前付きブランチをgitブランチに変換することです。さらに、git masterブランチをデフォルトの名前のないhgブランチに設定します。


git-hgHgからプルする場合にのみ実行可能であり、プッシュする場合には実行できないようです(私の回答でリンクしている説明を参照してください)。双方向でうまく使用する方法を見つけましたか?余分なスペースに関しては、私がよく知っているすべてのテクニックには、dir + git db / metadataの1つのコピー+ hg db / metadataの1つのコピーが含まれます。git db / metadataの2番目のコピーを追加すると、ディスクの使用量が増加しますが、確かに、見た目ほど悪くはありません。
dubiousjim

@dubiousjim私のニーズは動作するプル/フェッチで満たされ、実際にプッシュをテストしたことはありません。私はドキュメンテーションを信頼していましたが、あなたの説明をチェックした後、私は今それgit-hgがプッシュするのに適していないと信じています。push十分に安定していないことをより明確にするために、回答を修正しました。
Mikko Rantalainen、2012

残念ながら、私が見ていなかった、pushをうまく使用する方法がいくつかあるのではないかと思いました。
dubiousjim

1
+1インピーダンスの不一致と何を探すべきかを強調するため
マットウィルキー2013

3

hggitを試しました。私はgit'ersとhg'ersの仕事に対処しなければならないので、私にとってはうまくいきます。特にレビューの場合、これは素晴らしいです。

そのトピックに関する軽微な問題/警告:

私はhgを使用して安定したLinuxカーネルリポジトリのクローンを作成しようとしました。これらのリポジトリはgitで管理されており、通常は多数のファイルが含まれています。

とても遅かった。作業コピーを完全に複製して更新するのに2日かかりました。


それは良くなっているようです---私のチェックアウトは約6時間実行されており、あと9つしかないと主張しています...
デビッド・ギブン

私はそれを取り戻します。現在は約25時間稼働していますが、あと9つしか残っていないと主張しています。二日、あなたは言いましたか?
デビッドギブン

1
私はそれを経験しました-私の最初の試みはまったく機能しませんでした-それはいくつかのバグであると思いますが、2回目の試みではそれ以上分析しませんでした-更新されたhg-gitを使用すると、Mac Bookで完了するまでに約50時間かかりましたプロ(2.66 GHz、8ギガRAM)
Wizz

39時間後、残りわずか11時間です。クアッドコアAMD Phenom。それ進歩を遂げているので、私はそれを実行させています(hgプログレスバー拡張は必須です)。1つのCPUをペギングすることと、CPUをまったく使用しないことと、大量のディスクアクセスを行うことを交互に行います。
デビッドギヴン

一般に、カーネルサイズのプロジェクトhggitが原因で発生するパフォーマンス低下がhg遅すぎるかどうかをテストしたことはありますか?
Mikko Rantalainen、2012

1

私はcosminのgit-hgabourgetのgit-hg-againの両方をmuttのhg repoで試しましたが後でマージの順序を順守しているようですが、前者は少しランダムです。以下のスクリーンショットから確認できます。

cosminのgit-hgによってインポートされたmuttのマージ履歴グラフ:

ここに画像の説明を入力してください

abourgetのgit-hg-againによってインポートされたmuttのマージ履歴グラフ:

ここに画像の説明を入力してください

muttのhgリポジトリにhgkによってプロットされた実際の履歴グラフ:

ここに画像の説明を入力してください

上記からわかるように、abourgetのgit-hg-againによる2番目のグラフは元のhgkグラフに非常に近く、実際にはmuttの実際のワークフローを反映しています。

私が見つけたgit-hg-againの欠点の1つは、「hg」リモートを追加せず、すべての参照をローカルタグとしてインポートすることです。git-hgには、上流のhgリポジトリを表す素晴らしい「hg」リモートがあります。


1
cosminとabourgetのバージョンの違いは、マージコミットでの親の順序にある​​ように思えます。優れた履歴視覚化ツール(例gitk:)は、両方の履歴を同一にレンダリングできる必要があります。明らかな唯一の欠けているのはhg/stable、バージョンによるバージョンのブランチです。それはMercurialの名前付きブランチ、名前のないブランチ、ブックマークの間のものだと思います。
ミッコランタライネン2014

0

双方向のhg-git(およびgit-git、hg-hg)の同期は、サービスGit-hg Mirrorでも可能です。それは舞台裏で(特に)hg-gitを使用し、そのコードもオープンソースです。


免責事項:私はその背後にある会社から来ました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.