Subversion

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>

クライアント(Linux)へのインストール

yum install subversion

または

apt-get install subversion

クライアント(Mac OS X)へのインストール

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

クライアント(Windows)へのインストール

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 にする。

リンク


Last-modified: 2014-04-21 (月) 10:01:14 (798d)