Gitで各種Roguelikeソースコードを管理しよう(CVS/SVN/MercurialリポジトリをGitリポジトリに変換する際のメモ)

VirtualBox上の仮想PCがDisk Fullになっていたので何が容量食ってるのか調べたところ、意外にも変愚蛮怒SVNリポジトリが主原因でした。

% du -hs hengband
1.3G    hengband

1.3G……1.3G!? 思わず二度見するレベル。なお、仮想PCのディスクサイズはデフォルトの8Gだったので全体の1/6弱です。アホか。


なぜここまで膨れあがったかというと。
SVNはタグ付けしたスナップショットやらブランチやらをそのままディレクトリツリーの一部として取り込むようです。(正確な表現かどうかは分からないけれど)
さて、変愚蛮怒には現在39のタグと22のブランチがあります。単純に考えて、trunkツリーの61倍の容量が消費されているわけです。*1かなりの無駄ですね。LinusSVNを猛烈に批判するのをちょっとだけ分かった気がします。


まあ、リポジトリ全体をチェックアウトすること自体が変という話はあるのですが、もっとこうどうにかならんかと思って調べてみた結果、git-svnで大体よさそうという結論になりました。

git-svnのインストール

まずはgit-svnをインストールしましょう。devian系ならapt-getで多分OK。(テスト環境はUbuntu 10.04です)

% sudo apt-get install git-svn

これでgitのサブコマンドとしてgit svnが使えるようになります。

SVNリポジトリのインポート

変愚蛮怒リポジトリをインポートしましょう。
タグやブランチ等の情報を含めてインポートするには、--trunk,--tags,--branchesのオプションをそれぞれ指定します。

% git svn clone --trunk='Hengband/trunk' \
                --tags='Hengband/tags' \
                --branches='Hengband/branches' \
                http://svn.sourceforge.jp/svnroot/hengband/

しばらくかかるのでお茶でも飲みましょう。

% cd hengband
% ls
Makefile.am   autopick_eng.txt  hengband.spec  readme_angband
acinclude.m4  bootstrap*        lib/           readme_eng.txt
autopick.txt  configure.in      readme.txt     src/

ちゃんとtrunkのソースがチェックアウトされているようです。
チェックアウトしたリポジトリは今後通常のGitリポジトリとして扱うことができます。


元々のタグやブランチ一覧はgit branch -rで見られます。

% git branch -r
  branch-_nothere-objdesc
  branch-_nothere-subalign
(中略)
  tags/hengband-1-7-0
  tags/hengband-1-7-1
  trunk

SVNとGitではタグの扱いが全く異なるため、git-svnでインポートした際はタグ・ブランチともにリモートブランチとして扱われるようです。

% du -hs hengband
42M     hengband

ディスク消費もそこそこですね。

SVNリポジトリの更新に追従する

元々のSVNリポジトリが更新されたときに手元のGitリポジトリsvn up相当の操作を行いたい場合は

% git svn rebase

で更新されます。

% git config alias.up 'svn rebase'

とやると、そのリポジトリ内では"git up"だけで更新できます。まあこれは好みで。

CVSMercurialリポジトリもインポートしたい

SVNからGitへのインポートができれば、sourceforgeに置かれているroguelikeソースコードは大抵インポートできますが、JSlash'EM*2SVNに移行してないようです。あと、最近ちょっと話題になったchengband*3Mercurialで管理されているようですね。ついでなのでこれらもGitリポジトリに変換しましょう。

git-cvsのインストールおよびCVSリポジトリのインポート

これもapt-getで一発。

% sudo apt-get install git-cvs

CVSリポジトリのインポートをします。

% git cvsimport -v -d :pserver:anonymous@cvs.sourceforge.jp:/cvsroot/jslashem jslashem -C jslashem

こちらも(指定するリポジトリの規模によるが)割と時間がかかるので-vオプションを付けて途中経過が表示されるようにします。要らないならいいです。
あと、出力ディレクトリの指定をしないとカレントディレクトリにそのまま展開されてひどいことになるので-Cオプションで指定します。

コミットメッセージがUTF-8に変換できない旨のWarningが大量に出ますが大勢に影響ないので無視します。


cvs up相当の操作を行いたい場合は、もう一度同じコマンドを入力すると適宜差分を取ってきてくれるようです。
gitのコマンドとして扱いたいなら

% git config alias.up 'cvsimport -v -d :pserver:anonymous@cvs.sourceforge.jp:/cvsroot/jslashem jslashem'

とかそんなんでしょうか。

git-hgのインストールおよびMercurialリポジトリのインポート

aptには無いのでgithubから持ってきます。

% git clone https://github.com/offbytwo/git-hg.git
% cd git-hg
% git submodule update --init

これで/path/to/git-hg/bin以下にgit-hgの実行ファイルが作られるので、/path/to/git-hg/binを$PATHに含めるか、PATHの通ってるディレクトリにシンボリックリンクを張ります。私は後者にしました。


Mercurialリポジトリのインポートは以下の通り。

% git hg clone https://code.google.com/p/chengband/


それでは、楽しいRoguelikeライフを!

*1:trunkツリーは23Mなので概算としては正しいでしょう

*2:http://jslashem.sourceforge.jp/

*3:http://code.google.com/p/chengband/