2021-01-17

MercurialからGitへの移行

分散型バージョン管理システム (DVCS) の覇者はGitとなり、2020年6月にはBitbucketまでもがMercurialのサポートを終了してしまった。 かつて Mercurial をメインに使っていたので、手元には過去のMercurialのリポジトリが少なからず残っている。

必要に応じて少しずつGitリポジトリに変換しているのだが、歳をとったせいか、もともと鳥頭なのか、変換方法をすぐに忘れてしまうので、macOS Catalina 10.15.7環境でMercurialリポジトリをGitリポジトリにコンバートする手順をメモしておく。

Mercurial と Git は、バージョンの表現方法がよく似ており、また Git の方が少し柔軟性が高いので、Mercurial から Git へのリポジトリの変換は非常に素直に行えます。変換には "hg-fast-export" というツールを使用します。

——『Pro Git』より

変換作業を行うためには、Mercurialがインストールされている必要がある。 なんらかの手段でhgコマンドが使用できるようにしておく。gitコマンドが必要なのは言うまでもない。

$ brew install mercurial
$ hg --version
Mercurial Distributed SCM (version 5.6.1)
(see https://mercurial-scm.org for more information)

Copyright (C) 2005-2020 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

変換ツール hg-fast-export を入手する。

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

変換したいMercurialプロジェクト(リポジトリ)の名前が example-src であり、変換後のGitプロジェクト(リポジトリ)の名前が example-dst であると仮定する。

Mercurialプロジェクトexample-srcのコミットに不適切なフォーマットの author 情報がないことを確認する。

$ cd /path/to/example-src
$ hg log | grep user: | sort | uniq | sed 's/user: *//'
Jane Doe <jane@example.com>

author情報は「ユーザー名 <メールアドレス>」の書式になっていなければならない。もし、これとは異なる書式が含まれる場合は修正用のマッピングファイルを作成する必要がある。

変換先となるGitリポジトリを作成する。

$ git init /path/to/example-dst

Mercurialリポジトリ → Gitリポジトリの書き出しを行う。

$ cd /path/to/example-dst
$ /path/to/fast-export/hg-fast-export.sh -r /path/to/example-src

ファイル名の大文字/小文字の違いを無視する設定が有効だと怒られるが、

Error: The option core.ignoreCase is set to true in the git
repository. This will produce empty changesets for renames that just
change the case of the file name.
Use --force to skip this check or change the option with
git config core.ignoreCase false

オプション --force を付けて再実行すればよい(もし、どうしても大文字/小文字の違いを区別したいならcore.ignoreCaseの設定を変更する)。

$ /path/to/fast-export/hg-fast-export.sh -r /path/to/example-src --force
$ git checkout HEAD

変換されたGitリポジトリができあがるので、「.gitignore」などMercurialと差異のある部分をケアする。

0 件のコメント:

コメントを投稿