Mercurialプロジェクトをgitプロジェクトに変換する必要がありますが、コミット履歴はそのまま残しておきたいのです。私の現在の解決策は、単にhg関連ファイルを削除してから、initと&gitを使って必要なファイルを手動で追加することでした。これに対する解決策はありますか?
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 もご覧ください。
わかりました私はついにこれを解決しました。これはWindows上でTortoiseHgを使用しています。使用していない場合は、コマンドラインで実行できます。
hggit
を有効にします。コマンドラインを開き、空のディレクトリを入力します。
git init --bare .git
(裸のリポジトリを使わないとabort: git remote error: refs/heads/master failed to update
のようなエラーになります)
Mercurialリポジトリへのcd
。
hg bookmarks hg
hg Push c:/path/to/your/git/repo
Gitディレクトリで:git config --bool core.bare false
(理由を聞かないでください。「作業ツリー」についての何か。Gitは非常に友好的ではありません。実際のコードを書くことはGitを使うより簡単であることを誓います)
うまくいけばそれはうまくいくでしょう、そしてそれからあなたはその新しいgitリポジトリから素のものではないものにプッシュすることができます。
既存のMercurialリポジトリを 'GitHub'リポジトリにインポートしたい場合は、 GitHub Importer available こちら [ログインが必要]を使用するだけで済みます。 fast-exportなどで面倒なことはもうありません(非常に優れたツールですが)。
あなたはcommits、branchesそしてtagsすべてをそのまま残します。もう1つクールなことは、author's email-idも変更できるということです。以下のスクリーンショットをチェックしてください。
私のMercurialからGitへの変換に関する経験についてのいくつかのメモ。
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の間でリポジトリを選択することができますし、切り替えるオプションはありません。私はサポートチケットを調達し、彼らが返事したら結果を共有します。
Hg-Git Mercurialプラグイン( http://hg-git.github.io/ )は私のために働きました。参考:Mac OSXの場合私は次のようにhg-gitをmacports経由でインストールしました。
.hgrcには以下の行が必要です。
[ui]
username = Name Surname <[email protected]>
[extensions]
hgext.bookmarks =
hggit =
私はそれから成功しました:
hg Push git+ssh://[email protected]:myaccount/myrepo.git
上記のすべては鈍い道具であり、チームが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
私は同じような仕事をしていましたが、ここには他の答えでは十分にカバーされていないいくつかの側面が含まれていました。
私は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からあなたのローカルマシンにそれを引き出すのに必要な限りあなたのリポジトリが公開されることを許容できる限り)。
(*)そのため、前にのように見えました。エクスポートしたいすべてのブランチをブックマークする必要があることがわかりました。リンクした答えが言うように、裸の(!)リポジトリにプッシュしてプッシュすると、すべてのブランチが得られます。
もう1つの選択肢は、無料のKilnアカウントを作成することです。100%のメタデータを保持しながら、gitとhgの間のラウンドトリップを行います。
から:
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パスに関連しています(上記の注を参照してシステムに合わせてカスタマイズしてください)。
これで終わりです、完了です。
これはコメントとしては良いでしょう。申し訳ありませんが、コメント権限はありません。
@ 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に移行しました。