Apache 2 + Subversion
CentOSへのインストール:
yum install subversion yum install mod_dav_svn
Vine Linux 4.1へのインストール
apt-get install subversion apt-get install subversion-mod_dav_svn
hogeという名前のレポジトリを作る(Vine Linux 4ではApache 2のhtpasswdはhtpasswd2となる):
cd /var/www/svn svnadmin create hoge chown -R apache:apache hoge htpasswd -cm /somewhere/passwd-hoge okumura htpasswd -m /somewhere/passwd-hoge darekasan (必要なだけ繰り返す)
メールで平文パスワードを送ってもらうのはアレなので,
htpasswd -nm ユーザ名
の出力をメールで送ってもらって,それをそのまま上の passwd-hoge ファイルにコピペすればよい。
/etc/httpd/conf.d/subversion.conf が設定(Vine Linux 4では /etc/apache2/conf.d/subversion.conf)。 これを書き換えたら apachectl graceful を忘れないように。
まず,ディレクトリごとのアクセス制御を行わないなら
LoadModule authz_svn_module modules/mod_authz_svn.so
はコメントアウトしてかまわない。
hogeというレポジトリを作って読み書きを制限するには次のようにする:
<Location /repos/hoge> DAV svn SVNPath /var/www/svn/hoge AuthType Basic AuthName "hoge" AuthUserFile /somewhere/passwd-hoge Require valid-user </Location>
書き込みだけ制限し,さらに認証時にSSLを強要するには:
<Location /repos/hoge> DAV svn SVNPath /var/www/svn/hoge <LimitExcept GET PROPFIND OPTIONS REPORT> SSLRequireSSL AuthType Basic AuthName "hoge" AuthUserFile /somewhere/passwd-hoge Require valid-user </LimitExcept> </Location>
yum install subversion
または
apt-get install subversion
Mac OS X 10.5ではDeveloper ToolsにSubversionコマンドラインクライアントが付属しているので,何もする必要はない。
Mac OS X 10.4までは,http://metissian.com/projects/macosx/subversion/ からバイナリをいただいてきてインストール。 /usr/local/ 以下に入る。
なお,ソースをmakeするなら以下のような具合か。
http://subversion.tigris.org/ から subversion と subversion-deps のソースをダウンロード。
cd /usr/local/src tar xvjf ..../subversion-1.4.0.tar.bz2 tar xvjf ..../subversion-deps-1.4.0.tar.bz2 cd subversion-1.4.0 ./configure --with-ssl make make install
Cygwinに入っている。Cygwinのインストール画面でSubversionにチェックを入れるだけ。
あるいはGUI版がよければ TortoiseSVN をインストール。
サーバ側でhogeというレポジトリを準備したら,クライアント側は,どこか(たぶんホームディレクトリ)で次のように打ち込む:
svn checkout https://hoge-u.ac.jp/repos/hoge
自己署名証明書の類を使っていると次のようなメッセージが出るかもしれない:
Error validating server certificate for 'https://oku.edu.mie-u.ac.jp:443': - The certificate is not issued by a trusted authority. Use the fingerprint to validate the certificate manually! Certificate information: - Hostname: oku.edu.mie-u.ac.jp - Valid: from Jan 6 07:36:49 2008 GMT until Jul 4 07:36:49 2008 GMT - Issuer: http://www.cacert.org, Root CA - Fingerprint: 50:c0:2a:c6:d9:72:0d:a4:fd:9d:4c:50:27:2f:73:c3:bc:c6:e5:1d (R)eject, accept (t)emporarily or accept (p)ermanently?
Fingerprintを確認して p を入力すると次回から警告が出なくなる。
パスワードを入れるとカレントディレクトリに hoge ができる。 すでにレポジトリにファイルが格納されている場合はそれがすべて取得される。 そうでない場合は hoge の中にいくつかのディレクトリを作る。 trunk,branches,tags といったディレクトリを作るのが標準的。 通常は trunk の中で開発を行う。 ファイルを作り,
svn add ファイル名
すればそのファイルがSubversionの管理下になる(まだ送られない)。
svn commit -m ''
とすればSubversionの管理下にあるもので編集したものだけがレポジトリに送られる。 checkout 後に他の人が commit したものをマージするには,hoge/trunk で
svn update
とする。
テキストファイルはUTF-8エンコードで保存する(行末やバイナリファイルについては後述)。
日本語のUTF-8ファイルがバイナリに誤認識されてしまうことがある。 これは svn add したときに (bin) と表示されるのでわかる。 次のようにしても調べられる。
$ svn propget svn:mime-type hoge.tex application/octet-stream
これはmime-typeがapplication/octet-streamになってしまっていることを表す。 mime-typeをtext/で始まる文字列にすればよい。 あるいは単にmime-typeを消すだけでもよいようだ。
$ svn propset svn:mime-type text/x-tex hoge.tex $ または svn propdel svn:mime-type hoge.tex $ svn commit -m ''
文字コードを指定したい場合は svn:mime-type 'text/plain; charset=euc-jp' などとすればよいらしい。 Subversionそのものは頭が text/ かどうかしか見ないが,閲覧するソフトが認識する可能性がある。
逆にバイナリファイルをテキストと見なされてしまった場合は
$ svn propset svn:mime-type application/octet-stream *.pdf
のようにする。
人間が編集するテキストファイルはsvn:eol-styleをnativeに設定しておくと便利である。
$ svn propset svn:eol-style native *.tex *.sty
などとしておけば,レポジトリ中ではEOLはLFになり,Windowsで取り出すとCR LFになる。
これらを自動判断させるには,~/.subversion/config でコメントアウトされている enable-auto-props = yes を生かし,最後のほうに書いてあるルールを適宜編集する。例:
*.txt = svn:mime-type=text/plain *.txt = svn:eol-style=native *.tex = svn:mime-type=text/x-tex *.tex = svn:eol-style=native *.rb = svn:eol-style=native;svn:executable *.pdf = svn:mime-type=application/pdf
もっとも,現状では *.txt = svn:mime-type=text/plain と書いておいてもSubversionが勝手にバイナリだと言ってエラーになることがある。こんなときの対処法:
$ svn add hoge.txt svn: File 'hoge.txt' has binary mime type property $ svn add --no-auto-props hoge.txt A (bin) hoge.txt $ svn propset svn:mime-type text/plain hoge.txt property 'svn:mime-type' set on 'hoge.txt'
この ~/.subversion/config では他にいろいろ設定できる。 log-encoding = latin1 となっているところのコメントを外し log-encoding = utf-8 に直しておく。 global-ignores = ... もコメントを外し,*.bak *.dvi *.log *.aux *.idx *.ilg *.blg のようなものを追加する。
trunk の内容が一段落したので,第1版として出版したい。 ただ,これも増刷ごとに少し改訂するかもしれないが,大きな改訂は加えない。 そこで,ブランチを切ろう。
cd branches mkdir 1.0 mkdir 1.0/branches mkdir 1.0/tags svn add 1.0 svn commit -m ''
こうしておいて,trunk 全体を 1.0 にコピーする。
svn copy https://..../repos/hoge/trunk https://..../repos/hoge/branches/1.0/trunk -m ''
これでサーバ側でコピーが起こる(実際はサーバ内では差分で保存されるのでほとんど容量は増えない)。 これで update したら 1.0 が取得できる。
branches でなく tags でも同様にできるが,こちらはスナップショットに用いる習慣である:
svn copy https://..../repos/hoge/trunk https://..../repos/hoge/tags/20070326 -m ''
/.subversion/auth/svn.simple/* に平文のパスワードが入る。 これが気になるなら,ここにあるファイルを消し,~/.subversion/config の [auth] あたりを書き換えてパスワードを記録しないようにする。
次のトラブルに悩まされた:
svn: Commit failed (details follow): svn: PROPFIND request failed on '/repos/hoge/geho.png' svn: PROPFIND of '/repos/hoge/geho.png': 200 OK (https://oku.edu.mie-u.ac.jp)
AjiNIMC » SVN error due to htaccess に似たようなことが書いてあったので,httpd.conf から
ErrorDocument 403 /forbidden.php ErrorDocument 404 /missing.php
を消してみたらうまくいった。
LANG=ja_JP.UTF-8にしているのに
svn: Can't convert string from 'UTF-8' to native encoding:
と言われた場合は LC_ALL も ja_JP.UTF-8 にする。