Bitbucket→GitHub 移行 その1~リポジトリ変換~


Bitbucket が Mercurial 形式のリポジトリをサポートしなくなるということで、愛用していた Mercurial から少し離れて GitHub に移行することにしました。

2020/6 にサポートが打ち切られるので、それまでに移行しないといけません。
必要なことですので、ササッとやっちゃいましょう。


複数回に分けて、Bitbucket にあったリポジトリをGitHub に移行した際の記録・注意点を残しておこうかと思います。

今回はリポジトリ変換について触れます。

なお、履歴を移行しない場合は、今回の手順は不要です。
ローカルリポジトリで git initgit push すればいいだけですので。
履歴を移行する(今回触れる リポジトリ変換を行う)かどうかを判断する材料の1つとしては、
今現在 複数のブランチに触っているかどうか、が挙げられます。
あとは、最近バグフィックスやリリースを行った場合も、安全策として履歴を移行したほうが良いかもしれません。

ちなみに、Windows 10 を使っています。
ただ、環境に依存する部分は少ないと思います。

リポジトリ変換

Mercurial から Git に変換する際には、Git ドキュメントサイト(日本語版)に沿って作業します。
Git へ移行する#Mercurial

Git をインストールする

これを機に最新版の Git for Windows をインストールしました。

最近のバージョンでは、git update-git-for-windows を実行するとアップデートできるようです。
このサブコマンドが無い場合は、サイトの方からダウンロードしましょう

インストーラーでは、いくつかオプションを提示されます。
好きに選んで良いでしょう。
今回は、以下のようにしました。(オプション名は省略しています)

  • OpenSSL
  • コマンドプロンプト利用
  • Checkout as-is, Commit Unix-style(core.autocrlf=input)

fast-export の実行環境を整える

Python2

後の手順になりますが、hg-fast-export.sh で Python2 を要求されます。
仕方がないのでインストールします。
環境切り替え系ツールを入れるのは、かえって状況をややこしくしそうなので、やめました。素のインストーラーを使ってインストールします。

pip で Mercurial

あとは、Python から Mercurial リポジトリを操作するためのパッケージもインストールします。

最初に pip をインストールして… pip (https://bootstrap.pypa.io/get-pip.py)
次に pip install mercurial

これで、ようやく fast-export 実行環境が整います。

fast-export を取得

最初に fast-export を clone してきます。

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

ディレクトリー構成

複数ある自分のローカルリポジトリと同じ場所に fast-export を置いています。

./
  fast-export/
    hg-fast-export.sh
    :
  my-repos1/
    .hg/
    :
  my-repos2/
    .hg/
    :

変換

各ローカルリポジトリ内でコマンド入力しています。

  1. ローカル Mercurial リポジトリで git init
    • .hg と .git が混在する
  2. git config core.ignoreCase false
    • この後の手順でエラーにならないようにするため。
  3. hg log | findstr ユーザ: > authors.txt して、 "old name"="new name " の形式に加工する。
    • git として不正なコミットユーザーにならないように、ユーザーの変換テーブルを定義しています。
    • findstr は Windows コマンドですので、Unix ユーザーは grep にしてください。
  4. ../hg-fast-export.sh -r . -A authors.txt
    • インストールの仕方にもよると思いますが、Git Bash の方でないと .sh が処理できません。

あとは、変換を繰り返す

手持ちのリポジトリに対して変換を繰り返していきます。

fast-export 自体は、コミットの数が 100 未満ぐらいなら、ほぼ一瞬で終わります。
どちらかというと、一連の手順を実行するのに手間取るくらいでしょうか。

古いリポジトリでは意外とユーザー名が統一されていないことがあります。
ユーザー名の変換テーブルがきちんと作成できていないと実行エラーが出ますので、注意してください。
最初に全リポジトリに対して findstr(or grep) かけて、変換テーブルを作成しておくと良いと思います。

そうすれば、手作業で行うことがほぼ無くなりますので、スクリプト化しやすいと思います。

GitHub にプッシュ

先に GitHub 上にリポジトリを作っておきます。
あとは、そこに向けて git remote add origin [email protected]:USER/REPOS.git して git push remote origin すればよいです。

SSH 周りの設定が必要ですが、このあたりは次回触れると思います。
ですが、この部分もできているということであれば、一連の移行作業はほぼ終わったことになります。
お疲れさまでした。