FrontPage  ページ一覧  検索  更新履歴  ログイン

subversion

Subversion メモ

参考にしたもの

  • Subversion:公式ガイド(日本語訳)

http://shiba.zive.net/book.html http://subversion.bluegate.org/doc/index.html

その他リンク

simm師匠のリナザウへの移植 http://pure.fan.gr.jp/hack/?SubversionIpk

CVS, arch, svn の比較(古い) http://www.sodan.org/~penny/scm/comparison.html

※ arch(tla)でのネットワーク越し利用は現在、http(plain/WebDAV)/ftp/sftpとなってます

インストール

0.28.00.34 以降でリポジトリの構造が変わったので、 subversion を version up する時は、リポジトリを dump しておいて新しい subversion で load して作り直す必要があります。

FreeBSD ports から WITH_MOD_DAV_SVN=YES でインストール

(apache2 を WITH_BERKELEYDB=db4{,1,2} で build しておく必要がある。)

ports は cvs2svn をインストールしてくれないようなので手で tools/cvs2svn/{cvs2svn.py, rcsparse} を ~/bin にでもコピー(python必要)

後述する viewcvs の devel 版を使うには swig が必要。 ports から swig をインストールする(supported language は適宜指定) ports の Makefile を修正して CONFIGURE_ARGS の --with-swig=no を yes に make install 後、 works/subversion-0.32.1/ で make swig-py して make install-swig-py 。インストール先は /usr/local/lib/svn-python になり、これを python script の側から PYTHONPATH に含めて読む必要がある。このようにして swig-py をインストールすると ports の +CONTENTS には含まれないので upgrade の際は注意。 subversion の make args に WITH_PYTHON=YES を追加して make & make install する。

MacOSX から fink でインストール

0.32.10.37 が current-unstable に存在している。 MacOSX 10.3 以上が必要。

build すると install する寸前でコケる (/sw/src/root-svn-0.32.1-1/sw/lib へインストールしてそれを /sw/lib/libsvn_*.dylib として参照しようとして)。

/sw/fink/dists/unstable/main/finkinfo/devel/svn.info の PatchScript のセクションをコメントアウトして s/need_relink=yes/need_relink=no/ しないようにして build し svn, svn-client を両方インストール。

実行時は環境変数 LANG は ja_JP.EUC か( LANG=ja ではエラーになる) LC_CTYPE=ja_JP.eucJP (10.3) か ja_JP.EUC (10.2)

手build

http://www.saiin.net/~silphire/tips/svninstall.html

viewcvs

viewcvs の開発版では svn のリポジトリを扱うことができる。 (リリース版では駄目) viewcvs の最新版は cvs で取得する。

% cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/viewcvs login

してカラのパスワードを送り

% cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/viewcvs co viewcvs

(参考: http://sourceforge.net/cvs/?group_id=18760 )

任意のディレクトリに install し、 viewcvs.cgi を cgi-bin ディレクトリに コピーする。 上述のように PYTHONPATH の設定が必要なので、例えば viewcvs.cgi 中で

sys.path.insert(0, '/usr/local/lib/svn-python')

等として必要なファイルが読み込めるようにする。

viewcvs.conf では行頭に空白があると無視されるようなので注意。

cvsgraph を viewcvs から有効にする時は cvsgraph.conf の cvsroot, cvsmodule は viewcvs の cvsgraph.conf のサンプルどおりにしておくのが吉。 ただし、どのみち cvsgraph では svn のリポジトリは扱えないもよう。

その他のリポジトリビューアー

リポジトリ構築

準備

svn access 者用に group svn を作っておく。 svn を利用する user (と、 webdav を使ってアクセスするなら apache の実行 user (www)) をそのグループに登録。

svn のリポジトリの構成には、プロジェクトごとに別個にリポジトリを作るものと、 一つのリポジトリの中に複数のプロジェクトが存在するものが考えられるが、 ここでは後者に従ってデザインした。 (参考:http://subversion.bluegate.org/doc/ch05s06.html

(とこの時は書いたが、運用してみると以下の点が気になった。 片方のプロジェクトがほとんどコミットされず別のプロジェクトで激しくコミットが続いたとする。 ここで前者のプロジェクトで差分を追おうとした時、リビジョン番号の大きく離れた2点間に そのプロジェクトのコミットが1件も含まれてなかったりする。 逆にいえばそのプロジェクトでは全くコミットしていないのに、他のプロジェクトのコミットで リビジョン番号が進められてしまう。)

CVS でリポジトリを /home/CVS/ に置いていたとする。 /home/CVS/foovar を Subversion のリポジトリに移すことを考える。 まず /home/SVN を作り、そこを svn のリポジトリとする。

% mkdir /home/SVN
% svnadmin create /home/SVN

svn のリポジトリは以下のようになっていて、実体は db の中。

% ls -1 /home/SVN
README.txt
dav/
db/
format
hooks/
locks/
% svn ls file:///home/SVN
(なにもなし)
% chgrp -R svn /home/SVN/
% chmod -R g+w /home/SVN/db /home/SVN/locks

cvs2svn.py で CVS のリポジトリを移す。

cvs2svn は python のスクリプトで、 CVS のリポジトリを読み込み svn のリポジトリにそれを commit しなおしてくれる。 その際 CVS の commit log を手がかりに一度に commit されたと思われる 修正は svn のアトミックな commit に置き換えてくれる。

まず、テンポラリディレクトリを作成し、移行する CVS のリポジトリを コピーしておく。

% mkdir tmp0
% cp -Rp /home/CVS/foovar tmp0/

テンポラリディレクトリを指定して cvs2svn にかける。 svn リポジトリは -s /home/SVN の形で指定する。

% cvs2svn.py -s /home/SVN tmp0

カレントディレクトリに cvs2svn-hoge なゴミが残っていたら適宜消す。

SVN のリポジトリは db 形式なのでそのままでは確認できない。

% svn ls file:///home/SVN
branches/
tags/
trunk/
% svn ls file:///home/SVN/trunk
foovar/

project の import

新しいプロジェクト hoge を import することを考える。 まずリポジトリ上にそのプロジェクトのディレクトリを作っておく。

% svn mkdir file:///home/SVN/trunk/hoge

svn import はローカルのディレクトリ名を指定し、 そのディレクトリ中の全てのファイルをリポジトリに一度に登録する。

% svn import hoge file:///home/SVN/trunk/hoge

リポジトリの引っ越し

リポジトリの内容は svnadmin dump で出力させたリポジトリは svnadmin load で 新たなリポジトリに移し込むことができる。

% svnadmin dump /home/SVN.old | gzip > ~/SVN_old.dump.gz
% svnadmin create /home/SVN.new
% gzip -dc ~/SVN_old.dump.gz | svnadmin load /home/SVN.new

dump したテキストファイルを処理する svndumpfilter というツールが存在する。 これを使うとリポジトリの一部だけを抽出して別のリポジトリに移設することができる。

misc

berkeley DB の制約から svn リポジトリをリモートファイルシステム上に置くことはできない

運用

checkout

% svn checkout file:///home/SVN/trunk/foovar foovar-svn

update/status/log/diff/commit

この辺は cvs と一緒。 SVN は管理情報もローカルにコピーする。 svn status はリポジトリではなくローカルの情報を参照する。 最後に update/commitした時からローカルのファイルに加えられた変更は svn status で確認することができる。 diff も同様に外部のリポジトリへのアクセスを必要としない。

add/delete/move/revert

ファイルの rename ができるようになった。ディレクトリの扱いもましになってる。いぇ〜い。 svn revert はローカルの変更を廃棄してファイルを取得し直す働きをするが、 リポジトリからではなくローカルキャッシュからの再生になる。

$Id$

RCS の $Id$ と同様のキーワード置換の機能がある。 svn がファイルに付加する属性の一つにキーワード置換属性があり、 登録されたキーワードが置換される。この場合は Id というキーワードを 属性 svn:keywords にセットする。 属性はファイルごとにつくので、新しくファイルを登録したら 一度はセットする必要がある。

% svn propset svn:keywords "Id" *.c
% svn commit

小技

任意の revision の取得
svn cat -r n hoge > hoge
cvs update -j 1.n 1.m hoge と同じことをする
svn merge -r n:m hoge
rm hoge して cvs update し直ししてたのと同じこと
svn revert hoge
リポジトリの分割
svnadmin dump して svndumpfilter include trunk/hogehoge して要るものだけ抽出。 svnadmin load で新しいリポジトリに埋め戻す(svn mkdir で trunk を作っておく必要があるかも)

ネットワークアクセス

apache2 との連携

  • apache の側で以下のモジュールを有効にしておく
    • LoadModule dav_module libexec/apache2/mod_dav.so
    • LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so
    • LoadModule authz_svn_module libexec/apache2/mod_authz_svn.so
  • リポジトリ(以下の例では /home/SVN)ごとに設定
<Location /svn>
    DAV svn
    SVNPath /home/SVN
    AuthType Basic
    AuthName "Subversion repository"
    AuthUserFile /home/SVN/passwd
    <LimitExcept GET PROPFIND OPTIONS REPORT>
        Require valid-user
    </LimitExcept>
</Location>

認証方法とパスワードファイル (3-5行目)、write restricted (<LimitExcept>)

svn ls で見えていたファイル構造は、上述の設定を行っていれば www 経由で同じものを確認できる。 svn ls http://example.com/svn/ でも同じものが見える(@_@)。

パスワードファイル /home/SVN/passwd は apache の htpasswd で作成する。 以下の例ではユーザ名を svn として、パスワードファイルを作成している。 この時点ではパスワードファイルがまだ存在していないので -c をつけている。

% htpasswd -C /home/SVN/passwd svn
New password: ***** 
Re-type new password: *****
Adding password for user svn

この例では require valid-user は GET, PROPFIND, OPTIONS, REPORT 以外でのみ要求されている。

配布物の tools/xslt/ 以下のファイルを apache のドキュメントルートに置き、

SVNIndexXSLT "/svnindex.xsl"

を httpd.conf で有効にすることで表示をカスタマイズできる。 xslt ファイルは www の URL で参照されるので /svn 以下に置くと アクセスできない。

svnserve を inetd から起動する

/etc/inetd.conf に以下を追加

svnserve        stream  tcp     nowait  root    /usr/local/bin/svnserve svnserve -i -r /home/SVN

/etc/services にも以下を追加して

svnserve        3690/tcp

inetd に HUP を送る

svn access は認証しない。唯一可能な制限はリードオンリーで、これは inetd から起動する svnserve に -R オプションをつけることで行われる。 /home/SVN/conf/svnserve.conf で認証関連の設定が可能です。 デフォルトでは anon-access = read となっており、認証されていなくても checkout や update はできます (cvs での anoncvs 相当)。 また auth-access = write になっているので、 svnserve で認証された場合は commit が可能になります。 svnserve 認証用のパスワードファイル /home/SVN/svnusers を作成し、

[general]
password-db = /home/SVN/svnusers

と conf/svnserve.conf に記述します。 (初期状態では [general] もコメントアウトされているので注意) svnusers の中の記述は

[users]
yagikuro = InariNoUjiko

の様に認証用ユーザ名に対してパスワードを列記します。 チェックアウトでは認証されないので普通にチェックアウトし

% svn co svn://example.com/foovar

commit 時にパスワードを訊いてくるので、対話的に答えます。

Authentication realm: <svn://example.com:3690> testing repo
Password for 'kuroyagi': 
Authentication realm: <svn://example.com:3690> testing repo
Username: yagikuro
Password for 'yagikuro': 

1回認証するとクライアントサイドでキャッシュされるようです。 (~/.subversion/auth/svn.simple/ 以下にファイルで落ちる)

protocol を svn+ssh:// とすると svn は ssh を経由でリモートホストの svnserve を起動し利用する。この場合は ssh の段階で認証が必要になる。

network 越しの checkout

上述したようにして http でアクセスできている時は

%svn checkout http://example.com/svn/foovar

また svnserve を /etc/inetd.conf と /etc/services に登録してあって inetd 経由で起動できるか、 (svnserve -d として) daemon としてあらかじめ起動しておけば(デーモンモード)

% svn checkout svn://example.com/foovar

また svn に ssh 経由でリモートの svn を叩かせ(トンネルモード)

% svn checkout  svn+ssh://example.com/foovar
更新日時:2004/05/20 18:57:42
キーワード:
参照:[GNU arch] [覚書]