web-dev-qa-db-ja.com

MercurialプロジェクトをGitに変換する

Mercurialプロジェクトをgitプロジェクトに変換する必要がありますが、コミット履歴はそのまま残しておきたいのです。私の現在の解決策は、単にhg関連ファイルを削除してから、initと&gitを使って必要なファイルを手動で追加することでした。これに対する解決策はありますか?

247
gandolf

fast-export を使って試すことができます。

cd ~
git clone https://github.com/frej/fast-export.git
git init git_repo
cd git_repo
~/fast-export/hg-fast-export.sh -r /path/to/old/Mercurial_repo
git checkout HEAD

this SO question もご覧ください。

256
akluth

わかりました私はついにこれを解決しました。これはWindows上でTortoiseHgを使用しています。使用していない場合は、コマンドラインで実行できます。

  1. TortoiseHgをインストールする
  2. エクスプローラの何もない場所を右クリックして、TortoiseHgの設定に行きます。

TortoiseHg Settings

  1. hggitを有効にします。

enter image description here

  1. コマンドラインを開き、空のディレクトリを入力します。

  2. git init --bare .git(裸のリポジトリを使わないとabort: git remote error: refs/heads/master failed to updateのようなエラーになります)

  3. Mercurialリポジトリへのcd

  4. hg bookmarks hg

  5. hg Push c:/path/to/your/git/repo

  6. Gitディレクトリで:git config --bool core.bare false(理由を聞かないでください。「作業ツリー」についての何か。Gitは非常に友好的ではありません。実際のコードを書くことはGitを使うより簡単であることを誓います)

うまくいけばそれはうまくいくでしょう、そしてそれからあなたはその新しいgitリポジトリから素のものではないものにプッシュすることができます。

76
Timmmm

既存のMercurialリポジトリを 'GitHub'リポジトリにインポートしたい場合は、 GitHub Importer available こちら [ログインが必要]を使用するだけで済みます。 fast-exportなどで面倒なことはもうありません(非常に優れたツールですが)。

あなたはcommitsbranchesそしてtagsすべてをそのまま残します。もう1つクールなことは、author's email-idも変更できるということです。以下のスクリーンショットをチェックしてください。

enter image description here

enter image description here

60
atulkhatri

私のMercurialからGitへの変換に関する経験についてのいくつかのメモ。

1. hg-fast-export

Hg-fast-exportの使用に失敗し、上記のように--forceが必要でした。次に、私はこのエラーを得ました:

エラー:参照をロックできません '参照/ヘッド/安定': '参照/ヘッド/安定/サブブランチ名'が存在します。 'refs/heads/stable'を作成できません

Hg-fast-exportが完了すると、私はレポジトリを切断しました。このリポジトリには孤立したブランチがいくつかあり、hg-fast-exportには多少理想的なリポジトリが必要だと思います。これは端のまわりで少し荒く見えたので、私はKiln Harmony( http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/ )に進みました

キルン

Kiln Harmonyは上記のように無料利用枠のアカウントには存在しないようです。 Git-onlyとMercurial-onlyの間でリポジトリを選択することができますし、切り替えるオプションはありません。私はサポートチケットを調達し、彼らが返事したら結果を共有します。

3. hg-git

Hg-Git Mercurialプラグイン( http://hg-git.github.io/ )は私のために働きました。参考:Mac OSXの場合私は次のようにhg-gitをmacports経由でインストールしました。

  • Sudoポートインストールpython27
  • Sudo port select --set python python27
  • Sudoポートインストールpy27-hggit
  • vi〜/ .hgrc

.hgrcには以下の行が必要です。

[ui]
username = Name Surname <[email protected]>

[extensions]
hgext.bookmarks =
hggit = 

私はそれから成功しました:

hg Push git+ssh://[email protected]:myaccount/myrepo.git

4.警告:あなたのレポを知ってください

上記のすべては鈍い道具であり、チームがgitを適切に使用するのに十分な時間がかかったため、私は先に進めました。

最初に(3)に従ってプロジェクトを推し進めると、すべての新しい変更が失われてしまいました。これは、このコード行をガイドとしてのみ表示する必要があるためです。

$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created

理論上、デフォルトブランチはgitに移行するときにmasterと見なすことができます。私の場合、それらがmasterと同等のものとして 'stable'を使用するレポを継承しました。さらに、私はまたリポジトリの先端がまだ 'stable'ブランチとマージされていないホットフィックスであることを発見しました。

Mercurialと変換されるリポジトリの両方を正しく理解していなければ、おそらく変換を行わない方がよいでしょう。

2回目の変換試行に備えてリポジトリを準備するために、次のことを行いました。

hg update -C stable
hg merge stable/hotfix-feature
hg ci -m "Merge with stable branch"
hg Push git+ssh://[email protected]:myaccount/myrepo.git

この後、私はgitで検証可能な同等のプロジェクトを手に入れました、しかし私が以前に言及した孤立したブランチはすべてなくなりました。それほど深刻なことではないと思いますが、見落としとしてこれを後悔する可能性があります。それで私の最終的な考えはとにかくオリジナルを保つことです。

編集:あなたがgitで最新のコミットをしたいだけなら、これは上記のマージよりも簡単です:

hg book -r tip master
hg Push git+ssh://[email protected]:myaccount/myrepo.git
16
Dion Truter

私は同じような仕事をしていましたが、ここには他の答えでは十分にカバーされていないいくつかの側面が含まれていました。

  • 私は自分のリポジトリのall(私の場合は2つ、あるいは一般的には2つ以上)のブランチを変換したいと思いました。
  • 私は自分のコミットメッセージとファイル名に非ASCII文字と(Windowsユーザーであることによる)非UTF8でエンコードされた文字(好奇心から:ドイツ語のウムラウト)を使っていました。

私はfast-exportとhg-fast-exportを試しませんでした、それらはあなたがあなたのマシン上にあなたがPythonといくつかのMercurial Pythonモジュールを持っていることを必要とするからです。

私はTortoiseHGでhg-initを試しました、そして この答え 私に良いスタートを与えました。しかし、現在のブランチを変換するだけで、一度に全部変換するわけではないようです(*)。だから私は hg-init docsこのブログ記事 を読んで追加しました

[git]  
branch_bookmark_suffix=_bookmark

私のMercurial.iniに

hg bookmarks -r default master  
hg bookmarks -r my_branch my_branch_bookmark  
hg gexport

(変換したいブランチごとに2行目を繰り返し、3行目を実行する前に別のコミットを行う必要がある場合は、もう一度それを繰り返します)。これにより.hg内にフォルダーgitが作成されます。これは、エクスポートされたすべてのブランチを含む裸のGitリポジトリになります。私はこのレポを複製することができ、望み通りに作業コピーを持っていました。

それともほとんど...

ランニング

git status

私の作業コピーでは、名前にASCII以外の文字を含むすべてのファイルが追跡されていないファイルとして表示されていました。それで、私は調査を続けて、続きました このアドバイス

git rm -rf --cached \*  
git add --all
git commit 

そしてついにレポはBitbucketにプッシュされる準備ができました:-)

この答え にあるように、私はGithubインポーターも試しました。私はソースシステムとしてBitbucketを使用しました、そしてGithubはかなり良い仕事をしました、すなわちそれはすべてのブランチを自動的に変換しました。ただし、コミットメッセージ(Web-UIおよびローカル)およびファイル名(Web-UIのみ)に含まれるすべての非ASCII文字に '?'文字が表示され、上記のようにファイル名を修正できましたが、わかりませんでしたコミットメッセージをどうするか、それで私はhg-initアプローチを好むでしょう。エンコードの問題がなければ、Githubインポーターは完璧で迅速な解決策でした(有料のGithubアカウントを持っているか、Githubからあなたのローカルマシンにそれを引き出すのに必要な限りあなたのリポジトリが公開されることを許容できる限り)。


(*)そのため、前にのように見えました。エクスポートしたいすべてのブランチをブックマークする必要があることがわかりました。リンクした答えが言うように、裸の(!)リポジトリにプッシュしてプッシュすると、すべてのブランチが得られます。

8
Matthias

もう1つの選択肢は、無料のKilnアカウントを作成することです。100%のメタデータを保持しながら、gitとhgの間のラウンドトリップを行います。

8
Ry4an Brase

から:

http://hivelogic.com/articles/converting-from-Mercurial-to-git

移行中

それは比較的単純なプロセスです。最初に高速エクスポートをダウンロードし(最善の方法はGitリポジトリを経由してデスクトップにコピーすることです)、次に新しいgitリポジトリを作成し、移行を実行してHEADをチェックアウトします。コマンドラインでは、次のようになります。

cd ~/Desktop
git clone git://repo.or.cz/fast-export.git
git init git_repo
cd git_repo
~/Desktop/fast-export/hg-fast-export.sh -r /path/to/old/Mercurial_repo
git checkout HEAD

Fast-exportを実行した後にプロジェクトが移行されるにつれて、コミットの長いリストが飛んでいくはずです。エラーが発生した場合、それらはおそらく不適切に指定されたPythonパスに関連しています(上記の注を参照してシステムに合わせてカスタマイズしてください)。

これで終わりです、完了です。

8
Reck Hou

これはコメントとしては良いでしょう。申し訳ありませんが、コメント権限はありません。

@ mar10コメントは私がこれをするために必要な欠けている部分でした。

'/ path/to/old/Mercurial_repo'はファイルシステム上のパスでなければならないことに注意してください(URLではありません)、前に元のリポジトリを複製する必要があります。 - 13年12月27日、16:30のMar10

このコメントは私のためにこれを解決した答えに関してでした https://stackoverflow.com/a/10710294/2148757 これはここで正しいとマークされたものと同じ答えです https://stackoverflow.com/a/16037861/2148757

これにより、hgプロジェクトはコミット履歴をそのまま残してgitに移行しました。

2
Sashah