subversion
Subversion メモ
参考にしたもの
- Subversion:公式ガイド(日本語訳)
http://shiba.zive.net/book.html http://subversion.bluegate.org/doc/index.html
- UnixUser の 2003/8 の特集2(鵜飼さん)
- http://ukai.jp/Slides/2003/0521-lw2003/html/index.html
- http://www.02.246.ne.jp/~torutk/subversion/intro.html
その他リンク
simm師匠のリナザウへの移植 http://pure.fan.gr.jp/hack/?SubversionIpk
CVS, arch, svn の比較(古い) http://www.sodan.org/~penny/scm/comparison.html
- osdev-j:Subversion
※ 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
運用
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>
- 解説
- /home/SVN を http://example.com/svn/ に map し (1,2行目)、
認証方法とパスワードファイル (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
キーワード:
参照:[GNU arch] [覚書]