Windows機にあったレポジトリをDebian機に移行したところ、日本語を含むファイルが通信できなくなりました。
リポジトリの再配置やチェックアウトを行おうとすると、
svn: Can't recode string
というエラーが出ます。ただ、Debian側で
# svnlook tree /mnt/repos/書類
とすると、ファイルが表示されてるので、ちゃんとリポジトリには格納されているみたいです。(Debian-surgeのzshは現在Unicodeに対応していないので「書類」の部分は化けますが大丈夫です。無理だったら、"svnlook?"だけ書いたshファイルを作って試してみるといいかも。)
良くインターネット上に書いてある対処法に
# export LANG=ja_JP.eucJP
すれば良い、と書いてありますのでまずはこれを試してみます。
とりあえず、inetd経由で起動することになっているsvnを止めます。
% sudo vi /etc/inetd.conf
# svn stream tcp nowait svn /usr/sbin/tcpd /usr/bin/svnserve -i -r /mnt/repos
(コメントアウトする)
% sudo killall -HUP inetd
んで、daemonとして起動してみる。
% su
# LANG=ja_JP.UTF-8 /usr/bin/svnserve -d -r /mnt/repos
これで日本語ファイルも通信できました。LANG=ja_JP.UTF-8にするためにはDebianにUTF-8ロケールを追加しなければいけません。方法はこのページが詳しいです。
またdaemonとして起動するために、引数は-dと成ってるのに注意してください。
で、これで日本語ファイルも扱えるようになったんですが、ただでさえメモリの少ない機(というか玄箱)なので、daemonではなくてinetd経由でどうしても起動したいのです。
が、ここで迷う。svnserveはユーザーsvnとして起動するのですが、どこでLANGを設定すればいいんだろう。ホームディレクトリすらないしなぁ。
/etc/profileはbashだよなぁ。/etc/environmentもja_JP.UTF-8になってる。
というわけで、いろいろ試してみたけど分かりませんでした。もっと調べても良かったんですけど、etchに成ったときに変わるかもしれないみたいなんで、断念。
とりあえずの対処法を書いておきます。
% su
# vi /system/svnservejp.sh (どこでもいいです)
#!/bin/sh
export LANG="ja_JP.UTF-8"
/usr/bin/svnserve -i -r /mnt/repos
# chmod u+x /system/svnservejp.sh
# vi /etc/inetd.conf
svn stream tcp nowait svn /usr/sbin/tcpd /system/svnservejp.sh
# killall -HUP inetd
これでよし。接続のたびにシェルが一個無駄だけど、まぁ仕方ないか。この方法はcronやメールスクリプトでも使えるので覚えておいて損はないですよ。