長らくやろうと思っていた自作のモジュールやスクリプトの SVN を公開してみました。→ svn.bulknews.net
svnserve でレポジトリの read-only アクセスを公開、viewcvs でディレクトリをブラウズできるようにしてます。ここまで紆余曲折あったので、備忘録代わりにちょっとまとめておきます。
今年の2月ぐらいに、CVS から subversion に移行しました。subversion に付属している cvs2svn ツールを使ってほぼ一発で移行が完了したんですが、
* 公開したくないディレクトリがまじっている
* ディレクトリ構造がフラット
* 認証とか面倒だなあ
ということで公開はほったらかしていました。パッチを受け付けたり、こまいツールを公開するときは subversion レポジトリを公開しておいたほうが便利だということで、ちょっくら作業してみました。
ちなみに CVS から Subversion 化のメリットは一言では言い切れないぐらいたくさんありますが、こうした個人のホビープロジェクトなら、どうしても、という決め手になるものはないかもしれません。ただ、仕事のほうではブランチの管理・マージやディレクトリ・ファイルのリネームやアトミックな commit/revert など、subversion でないとお話にならない感じになってきているので、仕事とプライベートで同じツールを使うというのも無駄なノウハウを避けるという意味では重要かもしれません。
移行時に、CVS でフラットに管理していたのを svn の trunk にそのままつっこんだので、
- trunk
-- foo
-- bar
-- baz
という感じのディレクトリ構成になっています。とくに問題はないのですが、各プロジェクトでブランチや tag を張ることを考えると、
- foo
-- trunk
-- branches
-- tags
- bar
-- trunk
-- branches
-- tags
...
というディレクトリ構造が一般的。ということで、ダンプをつくって以下のように作業。
* cd {checkoutdir}; ls > ~/modules
* ~/modules を編集して公開したくないものを削除
* svnadmin dump /path/to/repo > dump
* svndumpfilter `perl -nle 'print "trunk/$_"' ~/modules` < dump > new.dump
* perl -i -nlpe 's|Node-path: trunk/([^/]*)|Node-path: $1/trunk|' new.dump
だんだんバッドになってきましたが、これでディレクトリ構造を入れ替えて、公開したくないディレクトリを除去したダンプができたので、
* svnadmin create /path/to/newrepo
* svn co file:///path/to/newrepo
* cd newrepo
* for i in `cat ~/modules`; do svn mkdir $i; done
* svn ci -m "create new directories"
* svnadmin load /path/to/newrepo new.dump
な感じで新しい SVN レポジトリができました。
で、あとは公開ですが bulknews.net のサーバでは Apache2 が走ってないので、DAV + SVN で公開するのはちょっと面倒です。基本的には自分だけコミット権をもって、anonymous で read-only という形態を考えているので、
* svn+ssh で書き込み
* svnserve -i -r /path/to/svn を tcpserver で起動
という感じにしました。ブラウザでの閲覧は SVN::Web を使おうと思ったんですが、mod_perl 1.x ではイマイチ挙動が不審だったので viewcvs の 1.0-dev (subversion をサポート) を使うことに。
ローカルでは svk を使って colinux 内にミラーを切ってあります。これでいつでもチェックアウトしたりブランチを切って ad-hoc 開発ができますね。svl (PDF) も試してみたいなあ。
うちはapache 2.0入れました。
SSL+.htaccess+DAV+SVNでコミット権限の制限までやってます。
viewcvsで見れるってのは良いですね。