* Subversion [#o3b58932]

Apache 2 + Subversion

**サーバへのインストール [#xeae01c5]

CentOSへのインストール:

 yum install subversion
 yum install mod_dav_svn

Vine Linux 4.1へのインストール

 apt-get install subversion
 apt-get install subversion-mod_dav_svn


**サーバ側のレポジトリの準備 [#fb1b860e]

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)へのインストール [#x5bc54d2]

 yum install subversion

または

 apt-get install subversion

**クライアント(Mac OS X)へのインストール [#raecdd29]

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)へのインストール [#ec6878da]

Cygwinに入っている。Cygwinのインストール画面でSubversionにチェックを入れるだけ。

あるいはGUI版がよければ
[[TortoiseSVN:http://tortoisesvn.bluegate.org/]]
をインストール。

** ユーザ側ですること [#c5ee5da2]

サーバ側で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エンコードで保存する(行末やバイナリファイルについては後述)。

** テキスト・バイナリ誤認識 [#b5453b73]

日本語の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 のようなものを追加する。

** ブランチを分ける [#j6cf227c]

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 ''


** セキュリティ [#sfce6ded]

~/.subversion/auth/svn.simple/* に平文のパスワードが入る。
これが気になるなら,ここにあるファイルを消し,~/.subversion/config の [auth]
あたりを書き換えてパスワードを記録しないようにする。

** トラブル [#c658c510]

次のトラブルに悩まされた:

 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:http://www.idealwebtools.com/blog/htaccess-svn/]]
に似たようなことが書いてあったので,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 にする。


** リンク [#m4cdf9af]

-[[Subversion によるバージョン管理:http://subversion.bluegate.org/doc/book.html]]
-Version Control with Subversion [[1.1:http://svnbook.red-bean.com/en/1.1/svn-book.html]] / [[1.2:http://svnbook.red-bean.com/en/1.2/svn-book.html]] /
[[1.4:http://svnbook.red-bean.com/nightly/en/svn-book.html]]