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かなりの無駄ですね。LinusがSVNを猛烈に批判するのをちょっとだけ分かった気がします。
まあ、リポジトリ全体をチェックアウトすること自体が変という話はあるのですが、もっとこうどうにかならんかと思って調べてみた結果、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"だけで更新できます。まあこれは好みで。
CVS・Mercurialのリポジトリもインポートしたい
SVNからGitへのインポートができれば、sourceforgeに置かれているroguelikeのソースコードは大抵インポートできますが、JSlash'EM*2はSVNに移行してないようです。あと、最近ちょっと話題になったchengband*3はMercurialで管理されているようですね。ついでなのでこれらもGitリポジトリに変換しましょう。
git-cvsのインストールおよびCVSリポジトリのインポート
これもapt-getで一発。
% sudo apt-get install git-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の通ってるディレクトリにシンボリックリンクを張ります。私は後者にしました。
% git hg clone https://code.google.com/p/chengband/
それでは、楽しいRoguelikeライフを!
*1:trunkツリーは23Mなので概算としては正しいでしょう