Python
Git
Mercurial
GitDay 3

MacでMercurialリポジトリをGitリポジトリに変換する

Mecurial_Git.png


はじめに

この記事は、Git Advent Calendar 2018 の3日目の記事です。

MercurialのリポジトリをGitのリポジトリに変換することになり、頑張って変換しました。

BitBucketのhgリポジトリを、githubのgitリポジトリに移行する

こちらの記事を参考にさせていただきましたが、私の作業環境がMacだからなのか、いくつかつまづいたポイントがありましたので、忘れない内に記事に書きます。

この方法では少なくとも、コミットログ(日時・作成者)を維持して変換することができます。

以降の説明では、作業ディレクトリは ~/ とします。

# ユーザーディレクトリを作業ディレクトリとする(任意)

cd ~/


Mercurialをインストールする

インストールしていなければインストールします。

brew install mercurial


fast-exportをダウンロードする

今回の目玉です。このソフトがリポジトリを変換をしてくれます。

Gitで公開されているので、以下のコマンドでダウンロードします。

git clone git://repo.or.cz/fast-export.git


python2を有効にする

fast-exportでは python2 というコマンドを利用しているようです。

MacにはデフォルトでPython2.7がインストールされているので、Python3系のインストール等をしていなければ、そのままで大丈夫です。特にここでの作業は必要ありません。

ただし、pyenv等の仕組みを使って、2.7系と3系のPythonを併用している場合、python2コマンドを有効にする必要があります。

以下のコマンドを叩けば、確認できます。

$ pyenv global

2.7.13
3.6.1

こんな風に 2.7.x が候補の中にあれば大丈夫です。

もし、なければ、以下のコマンドで追加します。

pyenv global 2.7.13 3.6.1

バージョン番号はご自身の環境に合わせて適宜読み替えてください。


pipをインストールする

pipはPythonのパッケージ管理ツールです。pyenv等を利用している人はおそらくインストール済みだと思います。

MacデフォルトのPython2.7を利用している場合は、pipをインストールしていない可能性があるので、インストールしてください。

いくつか方法がありますが、デフォルトのPython2.7を活かす場合は、こちらが参考になります。

macOSのデフォルトPythonでpipを使う


pipパッケージをインストールする

pipでmercurialのパッケージをインストールします。

# Python2.7系を明示的に指定してインストール

pip2 install mercurial

# Python3系を併用していないなら、これでもいいかも
pip install mercurial


Mercurialのローカルリポジトリを作成する

変換したいローカルリポジトリを用意してください。

もし、ローカルになければ、クローンで作成してください。

# Mercurialのローカルリポジトリを作成する

hg clone <MercurialリポジトリのURL> hg_repo

以後の説明では、~/hg_repoをMercurialのローカルリポジトリとします。


コミットのユーザー名を変更する

Mercurialのコミットログのユーザー名が所定の形式になっていないと、Gitにうまく変更できないようです。

以下のコマンドで確認します。

# Mercurialのリポジトリに移動

cd ~/hg_repo

# コミットログのユーザー名を一覧で表示
hg log | grep user:

表示されたユーザー名が hoge <hogehoge@example.com> のように ユーザー名 <メールアドレス>の形式になっていれば問題ありません。なっていなければ修正する必要があります。

まず、Mercurialの設定ファイル ~/.hgrcを編集します。なければ作ります。

# Mercurialの設定ファイルを作成する

touch ~/.hgrc

設定ファイルに以下を追記します。

[extensions]

hgext.convert=

これでhg convertコマンドが使えるようになります。

次に、~/authors.txtを作ります。

# Mercurialの設定ファイルを作成する

touch ~/authors.txt

このファイルに、ユーザー名の修正前と修正後を追記します。例えば、こんな感じです。

foo=foo <foo@example.com>

bar on Mac=bar <bar@example.com>

= の左が修正前で右が修正後です。

最後に、以下のコマンドを実行します。

hg convert --authormap authors.txt hg_repo hg_repo_2

新たに~/hg_repo_2が作られます。これでユーザー名が変更されます。

以後の説明では、~/hg_repo_2をMercurialのローカルリポジトリとします。


リポジトリを変換する

いよいよGitリポジトリに変換します。

# 空のGitリポジトリを作る

git init git_repo

# Gitリポジトリに移動
cd ~/git_repo

# MercurialのリポジトリをGitのリポジトリに変換する
~/fast-export/hg-fast-export.sh -r ~/hg_repo_2

# Gitリポジトリをチェックアウトする
git checkout HEAD

以上で変換完了です。おつかれさまでした。


さいごに

結構、苦戦してしまいまいしたが、何とかうまくいって良かったです。

作業にあたり、以下のサイトを参考にしました。ありがとうございました。