LoginSignup
3
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-23

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 git@github.com:USER/REPOS.git して git push remote origin すればよいです。

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3