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

![Mecurial_Git.png](https://qiita-image-store.s3.amazonaws.com/0/221845/70b32947-0d32-b883-1f19-cc53bb6b7c7f.png)

# はじめに

この記事は、[Git Advent Calendar 2018](https://qiita.com/advent-calendar/2018/git) の3日目の記事です。

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

[BitBucketのhgリポジトリを、githubのgitリポジトリに移行する](https://qiita.com/misogi@github/items/034b0aca6d6f5ae64cd9)
こちらの記事を参考にさせていただきましたが、私の作業環境がMacだからなのか、いくつかつまづいたポイントがありましたので、忘れない内に記事に書きます。

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

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

```bash
# ユーザーディレクトリを作業ディレクトリとする（任意）
cd ~/
```



# Mercurialをインストールする

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

```bash
brew install mercurial
```



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

今回の目玉です。このソフトがリポジトリを変換をしてくれます。
Gitで公開されているので、以下のコマンドでダウンロードします。

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



# python2を有効にする

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

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

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

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

```bash
$ 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を使う](https://qiita.com/tom-u/items/134e2b8d4e11feea8e12)





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

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

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

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



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

変換したいローカルリポジトリを用意してください。
もし、ローカルになければ、クローンで作成してください。

```bash
# Mercurialのローカルリポジトリを作成する
hg clone ＜MercurialリポジトリのURL＞ hg_repo
```

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



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

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

```bash
# Mercurialのリポジトリに移動
cd ~/hg_repo

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

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

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

```bash
# Mercurialの設定ファイルを作成する
touch ~/.hgrc
```

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

```ini
[extensions]
hgext.convert=
```

これで`hg convert`コマンドが使えるようになります。
次に、`~/authors.txt`を作ります。

```bash
# Mercurialの設定ファイルを作成する
touch ~/authors.txt
```

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

```ini
foo=foo <foo@example.com>
bar on Mac=bar <bar@example.com>
```

`=` の左が修正前で右が修正後です。
最後に、以下のコマンドを実行します。

```bash
hg convert --authormap authors.txt hg_repo hg_repo_2
```

新たに`~/hg_repo_2`が作られます。これでユーザー名が変更されます。
以後の説明では、`~/hg_repo_2`をMercurialのローカルリポジトリとします。

# リポジトリを変換する

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

```bash
# 空の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
```

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



# さいごに

結構、苦戦してしまいまいしたが、何とかうまくいって良かったです。
作業にあたり、以下のサイトを参考にしました。ありがとうございました。

- [BitBucketのhgリポジトリを、githubのgitリポジトリに移行する](https://qiita.com/misogi@github/items/034b0aca6d6f5ae64cd9)
- [pyenv利用環境でのnpm installでpython2周りのエラーが出た時](https://shinespark.hatenablog.com/entry/2015/10/29/012921)
- [コミットのユーザー名を変更する](http://www.proton.jp/main/programming/mercurial.html#username)