はじめに
この記事は、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
以上で変換完了です。おつかれさまでした。
さいごに
結構、苦戦してしまいまいしたが、何とかうまくいって良かったです。
作業にあたり、以下のサイトを参考にしました。ありがとうございました。