Bitbucket が Mercurial 形式のリポジトリをサポートしなくなるということで、愛用していた Mercurial から少し離れて GitHub に移行することにしました。
2020/6 にサポートが打ち切られるので、それまでに移行しないといけません。
必要なことですので、ササッとやっちゃいましょう。
複数回に分けて、Bitbucket にあったリポジトリをGitHub に移行した際の記録・注意点を残しておこうかと思います。
今回はリポジトリ変換について触れます。
なお、履歴を移行しない場合は、今回の手順は不要です。
ローカルリポジトリで git init
~ git 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/
:
変換
各ローカルリポジトリ内でコマンド入力しています。
- ローカル Mercurial リポジトリで
git init
- .hg と .git が混在する
git config core.ignoreCase false
- この後の手順でエラーにならないようにするため。
-
hg log | findstr ユーザ: > authors.txt
して、 "old name"="new name " の形式に加工する。
- git として不正なコミットユーザーにならないように、ユーザーの変換テーブルを定義しています。
- findstr は Windows コマンドですので、Unix ユーザーは grep にしてください。
../hg-fast-export.sh -r . -A authors.txt
- インストールの仕方にもよると思いますが、Git Bash の方でないと .sh が処理できません。
あとは、変換を繰り返す
手持ちのリポジトリに対して変換を繰り返していきます。
fast-export 自体は、コミットの数が 100 未満ぐらいなら、ほぼ一瞬で終わります。
どちらかというと、一連の手順を実行するのに手間取るくらいでしょうか。
古いリポジトリでは意外とユーザー名が統一されていないことがあります。
ユーザー名の変換テーブルがきちんと作成できていないと実行エラーが出ますので、注意してください。
最初に全リポジトリに対して findstr(or grep) かけて、変換テーブルを作成しておくと良いと思います。
そうすれば、手作業で行うことがほぼ無くなりますので、スクリプト化しやすいと思います。
GitHub にプッシュ
先に GitHub 上にリポジトリを作っておきます。
あとは、そこに向けて git remote add origin git@github.com:USER/REPOS.git
して git push remote origin
すればよいです。
SSH 周りの設定が必要ですが、このあたりは次回触れると思います。
ですが、この部分もできているということであれば、一連の移行作業はほぼ終わったことになります。
お疲れさまでした。