seclan のほえほえルーム

| |

Mercurial: hg-git を使って Mercurial の倉庫(リポジトリ) から git の倉庫に変換する方法

・
2020/06/04 []

最近履歴管理と言へば 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
#


by seclan

関連


| |

 

配信

101.71 msec