最近履歴管理と言へば git git だらけになってゐて、どうも Mercurial の肩身が狭くなってゐます。となると、少し git を試しても見たくなります。すると今の Mercurial の倉庫を git のに変へて試したくなります。今回はそのやり方に関してです。
これは、絶対こ書き残しておかないと忘れるやつなので、書く事にしました。
まづは今回の実験用に base ディレクトリに専用の倉庫を作成します。そして、bbb と云ふ名前の枝(ブランチ)作ります。するとかう云ふ感じになりました。
#hg init base # #cd base # #echo master > master.txt #hg add master.txt を追加登録中 #hg ci -m "master" #hg branch bbb 作業領域をブランチ bbb に設定 (ブランチは永続的且つ共有されます。ブックマークはいかがですか?) #echo bbb > bbb.txt #hg add bbb.txt を追加登録中 #hg ci -m "bbb" #ls bbb.txt master.txt #hg co -r default ファイルの更新数 0、 マージ数 0、 削除数 1、 衝突未解消数 0 #ls master.txt #echo aaa > aaa.txt #hg add aaa.txt を追加登録中 #hg ci -m "aaa" #ls aaa.txt master.txt #hg log -G @ changeset: 2:5d23a3b5e45c | tag: tip | parent: 0:06949a76eb4b | summary: aaa | | o changeset: 1:600d57da058d |/ branch: bbb | summary: bbb | o changeset: 0:06949a76eb4b summary: master #
ここで、変換先の git 倉庫(レポジトリ)を作成しておきます。この段階では作りたてで空っぽとなってゐます。ここに変換した履歴が入ることになります。
#cd .. #git init gitbase Initialized empty Git repository in gitbase/.git/ #cd base #
と云ふことで、変換元と変換先の準備ができました。
今回は、hg-git を使って変換します。そのため hg-git を導入し、hg-git ともう一つ bookmark 機能を有効化します。設定ファイル .hgrc (Windows の場合 Mercurial.ini も) に次のやうにして有効化します。
[extensions] hgext.bookmarks = hggit = /path/hggit
とりあへず、help 命令で次のやうに有効化されてゐれば大丈夫です。
#hg help Mercurial - 分散構成管理ツール コマンド一覧: ... bookmarks ブックマークの、新規作成、又は既存の一覧表示 ... 有効化されているエクステンション: ... hggit push and pull from a Git server ...
次に必要であれば、hg で使はれてゐる名前を git で使はれる名前に変換するファイルを作らなくてはなりません。git ではメールアドレスが必須なのでない場合は、それを加へた名前に変へる必要があります。ただ、自分だけで使ふ場合には関係ありません。
変へるときは、「.hg/hgrc」ファイルに次の行を加へます。
[git] authors = authors.txt
そして authors.txt には次のやうに各行に変換したい名前の対応を書きます。左が Mercurial での名前、右が git での名前です。複数行書くことが出来ます。また「#」で始まる行はコメントとして無視されます。
myname = mynane <myname@example.com> myname2 = mynane2 <myname2@example.com>
次は枝(ブランチ)です。もし、倉庫に枝がある場合、そのまま変換すると git の方では全て枝が消失してしまひます。これもどうしたら良いかわからず、大変でした。
結論から言ふと、各枝の先頭に bookmark を打つ必要があります。git での枝は Mercurial では、bookmark 相当だからと云ふ理由のやうです。
まづ、今ある倉庫の全ての枝の名前を列挙します。「-c」を付けて閉鎖済みのも列挙します。
#hg branches -c default 2:5d23a3b5e45c bbb 1:600d57da058d
これに対して、bookmark 用の名前をつけるわけですが、枝と同じ名前をつけることは出来ません。仕方がないので、ここでは枝の名前の頭に「hg-」を付けた名前にします。ただし、「default」枝に対してのみ「hg-master」と云ふ bookmark にします。
#hg bookmark -r default hg-master #hg bookmark -r bbb hg-bbb #hg bookmark hg-bbb 1:600d57da058d hg-master 2:5d23a3b5e45c #hg log -G @ changeset: 2:5d23a3b5e45c | bookmark: hg-master | tag: tip | parent: 0:06949a76eb4b | summary: aaa | | o changeset: 1:600d57da058d |/ branch: bbb | bookmark: hg-bbb | summary: bbb | o changeset: 0:06949a76eb4b summary: master #
これですべての準備ができました。一応 hg-git のキャッシュをクリアしておきます。
#hg gclear clearing out the git cache data
次に push 命令で gitbase を指定して、push します。この時「master」がどうたらと云ふエラーがでることがありますが、無視しても大丈夫なやうです。
#hg push ../gitbase ../gitbase への反映中 変更点を探索中 adding objects added 3 commits with 3 trees and 3 blobs #
これで Mercurial 側の操作はすべて終りました。次に gitbase に移り、名前を変へて設定した枝名から「hg-」を取り除き、元に戻します。
#cd ../gitbase # #git branch -m hg-master master #git branch -m hg-bbb bbb #git branch bbb * master #git log --graph * commit a5e7f8ab79cd26f3bb45c8b3a706fca463f4b1df | | aaa | * commit 37c0fb0a9cb0c1d61429ce8fd1a2eda25ff507f7 master # #git log --graph bbb * commit c2a95f16a571a2418783b6747a321d929549d7d1 | | bbb | | --HG-- | branch : bbb | * commit 37c0fb0a9cb0c1d61429ce8fd1a2eda25ff507f7 master # #git co #ls aaa.txt master.txt #git co bbb Switched to branch 'bbb' #ls bbb.txt master.txt #
これで終りです。
もし Mercurial 側の bookmark 名が不要なら、次のやうに削除できます。
#hg log -G @ changeset: 2:5d23a3b5e45c | bookmark: hg-master | tag: tip | parent: 0:06949a76eb4b | summary: aaa | | o changeset: 1:600d57da058d |/ branch: bbb | bookmark: hg-bbb | summary: bbb | o changeset: 0:06949a76eb4b summary: master #hg bookmark -d hg-master #hg bookmark -d hg-bbb #hg log -G @ changeset: 2:5d23a3b5e45c | tag: tip | parent: 0:06949a76eb4b | summary: aaa | | o changeset: 1:600d57da058d |/ branch: bbb | summary: bbb | o changeset: 0:06949a76eb4b summary: master #