一ヶ月くらい前から、Debian squeeze で svn が使えなくなってしまいま
した。
- svn diff の実行は出来る。
- file リポジトリへのアクセスも出来る。
- http リポジトリへのアクセスは、内部外部問わず出来ない。
という状況で地味に困っていましたが、~/.subversion/servers に以下を
追加することで解決できました。
http-library = serf
今回お世話になったサイトです。
svn(subversion)が突然使えなくなった at 半歩先
犯人は Neon モジュールでした。WebDav へのアクセスモジュールを serf
に変えることで回避できました。
世の中にはスゴイ人もいるものですね。私なんか、strace コマンドのログ
から locale や gcov まわりのエラーなのかと思って調べていました...。
subversion はソースからインストールしたことがあるので、WebDav アク
セスに Neon が使われていたことは知っていましたが、気づくことができ
ませんでした。他に serf があることと、~/.subversion/servers で変更
が出来ることはもちろん知りませんでした。
% svn --version (snip) * ra_neon : Neon を利用して WebDAV (DeltaV) プロトコルでリポジトリにアクセスするモジュール。 - 'http' スキームを操作します - 'https' スキームを操作します (snip) * ra_serf : serf を利用して WebDAV (DeltaV) プロトコルでリポジトリにアクセスするモジュール。 - 'http' スキームを操作します - 'https' スキームを操作します
追記(2009-07-21):
Neon が直ったようなので、~/.subversion/servers から "http-library
= serf" を削除しました。
ファイルの MIME タイプを確認
% svn propget svn:mime-type hoge.pdf
ファイルの MIME タイプをバイナリ(application/octet-stream)に設定
% svn propset svn:mime-type application/octet-stream hoge.pdf
ファイルの MIME タイプを application/pdf に設定
% svn propset svn:mime-type application/pdf hoge.pdf
ファイルの MIME タイプを削除
% svn propdel svn:mime-type hoge.pdf
追記(2011-03-06):
似たような操作で svn:ignore 属性を追加したり、削除したり出来ます。
Subversionで無視パターンを指定 - てんぷらメモ
追記(2011-12-30):
svn commit すると反映されます。svn revert すると、propset が破棄さ
れます。svn revert と git checkout は似ていますね。
リポジトリは [2004-05-05] に作ったもので、DB のフォーマットは
BerkeleyDB。BerkeleyDB は壊れやすく、データをメモリに配置するため
複数の CPU から書き込むのも NG らしい。そこで、最近のデフォルト
fsfs 形式に変更した。
# cd /usr/local
# svnadmin dump SVNROOT > SVNROOT.dump
# mv SVNROOT SVNROOT.bak
# svnadmin create SVNROOT
# svnadmin load SVNROOT < SVNROOT.dump
# chown -R www-data:www-data SVNROOT
[2008-01-12-1] の改良版。
http 経由でのアクセスのほうがカッコいい気がしたので、設定してみた。
1. mod_dav_svn をインストールした。
# apt-get install libapache2-svn
2. /etc/apache2/mods-available/dav_svn.conf に以下のみを記載した。
<Location /svn> DAV svn SVNPath /usr/local/SVNROOT AuthType Basic AuthName "Subversion Repository" AuthUserFile /usr/local/SVNROOT/conf/dav_svn.passwd <LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept> </Location>
3. ユーザ認証ファイルを作成した。
# htpasswd2 -c /usr/local/SVNROOT/conf/dav_svn.passwd masutaka
4. SVNROOT のオーナーとグループを、Apache を動かしている www-data さんにした。
# chown -R www-data:www-data /usr/local/SVNROOT
5. Apache を再起動した。
# /etc/init.d/apache2 restart
6. 後始末
6-1. /etc/inetd.conf から、以下の行を削除した。(長いので折り返しています)
svn stream tcp nowait masutaka /usr/sbin/tcpd /usr/bin/svnserve -i -r /usr/local/SVNROOT
6-2. inetd を再起動した。
# /etc/init.d/inetd restart
6-3. /usr/local/SVNROOT/conf/svnserve.conf の中身をすべてコメントアウトした。
6-4. /usr/local/SVNROOT/conf/passwd を削除した。
7. http://dyna.example.com/svn/ にアクセス出来ることを確認した。
"svn co http://dyna.example.com/svn/trunk ." が出来ることを確認した。
Web ブラウザでの表示は結構寂しい..。subversion-tools も入れるように
書いてあるところが多かったが、効能が分からなかったのでインストールしなかった。
(参考情報: http://qref.sourceforge.net/Debian/reference/ch-vcs.ja.html#s-svn)
[2005-11-07-2] の改良版。
svnserve 経由でアクセスすると、ユーザ名が残らなくて気持ち悪いので
簡易認証をすることにした。
/home/masutaka/SVNROOT/conf/svnserve.conf に以下を記載。
[general]
anon-access = none
auth-access = write
password-db = passwd
/home/masutaka/SVNROOT/conf/passwd にユーザ名とパスワードを記載。
[users]
masutaka = XXXXXXXX
svnserveで動かす場合、特に何も設定しないとリポジトリが読み取り専用に
なる。よって、変更をコミットしようとした場合
svn: Commit failed (details follow):
svn: Connection is read-only
というエラーになる。/home/masutaka/SVNROOT/conf/svnserve.conf に以下を
追加して解決した。(外部に公開しているわけではないので、セキュリティは甘々)
[general]
anon-access = write
1. /etc/inetd.conf に以下を記述して、inetd 経由で使えるようにする。
この例だと、リモートから /home/masutaka/SVNROOT にアクセスできるようになる。
svn stream tcp nowait masutaka /usr/sbin/tcpd /usr/bin/svnserve -i -r /home/masutaka/SVNROOT
2. [2003-07-21-1] を参考にして、lokkit から svn:tcp のアクセスを許可する。
/etc/services でポート番号 3690 が svn に割り当てられているはず。
3. inetd を再起動する。
# /etc/init.d/inetd restart
4. Cygwin からは以下のコマンドで checkout できる。
# 全部
% svn co svn://dyna/SVNROOT/trunk .
# 第一階層だけ
% svn co -N svn://dyna/SVNROOT/trunk .
# misc だけ
% svn co svn://dyna/SVNROOT/trunk/misc .
svn commit すると、以下のメッセージが出て commit に失敗する。
svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: URL に対し ra_local セッションを開始できません
svn: リポジトリ 'file:///home/masutaka/SVNROOT/trunk' を開けませんでした
svn: Berkeley DB error while opening environment for filesystem /home/masutaka/SVNROOT/db:
?\204?\181?\184?\250?\164?\202?\176?\250?\191?\244?\164?\199?\164?\185
svn: bdb: Program version 4.2 doesn't match environment version
DB のバージョンが違うみたい。以下のコマンドで復旧することができた。
% svnadmin recover ~/SVNROOT
% pwd
/home/masutaka
# 管理領域を作成
% svnadmin create SVNROOT
% svn mkdir -m "setup branches" file:///home/masutaka/SVNROOT/branches
% svn mkdir -m "setup tags" file:///home/masutaka/SVNROOT/tags
% svn mkdir -m "setup trunk" file:///home/masutaka/SVNROOT/trunk
# ~/.emacs を import
% svn import -m "Init" ~/.emacs file:///home/masutaka/SVNROOT/trunk/.emacs
# ~/.emacs を checkout
% mv .emacs .emacs.bak; cd ..
% svn checkout file:///home/masutaka/SVNROOT/trunk masutaka
% cd masutaka
# これ以降は add => commit で良いはず。
% svn add .zshenv; svn commit -m "Init" .zshenv
# すでに存在するディレクトリを commit
% svn add --non-recursive .w3m; svn commit -m "mkdir .w3m" .w3m
# ファイルの削除
% svn delete becky2mew.el; svn commit -m "delete becky2mew.el"
(URL: http://subversion.bluegate.org/doc/index.html)
(URL: http://ukai.jp/Articles/2003/uu-svn/)