Subversion利用時に"Can't recode string"エラーが発生することに対する対処法。

2006-10-16 05:33 JST by kcrt

 

 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やメールスクリプトでも使えるので覚えておいて損はないですよ。