Subversion

提供: ArchWiki
2016年1月11日 (月) 19:19時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

Apache Subversion はより良い CVS を目標に設計されたフル機能のバージョン管理システムです。CVS を置き換えるという本来の目標を大きく越えて Subversion は拡張され続けていますが、基本的なモデルや設計、インターフェイスはベター CVS という趣旨から外れてはいません。

この記事ではマシンに svn サーバーをセットアップする方法を説明します。人気のある svn サーバーは2つあり、svnserve に組み込まれているサーバーと、Apache HTTP Server で svn プラグインを使用するという高度な方法です。

Apache Subversion のセットアップ

目標

Subversion を Apache でセットアップするというのが目標です。Subversion のために Apache を使うのは、Subversion だけでは実現できない機能が存在することが理由になります:

  • Apache では https プロトコルを使用できます。svnserve で使用される md5 認証よりもセキュアです。
  • アクセス制御を細かく行うことができます。Apache の認証を使うことでディレクトリごとにパーミッションを制限できます。例えば、読み取りやトランクへのコミットは誰にでも出来るようにして、タグを付けたりブランチを作成するのは特定のグループだけに制限することが可能です。
  • フリーのリポジトリビューアが存在します。そこまで興奮することではありませんが、ちゃんと動作します。
  • Subversion チームはシームレスな webdav との統合に取り組んでいます。いつか webdav インターフェイスを使ってリポジトリ内のファイルを更新できるようになるはずです。

インストール

Apache HTTP Server をインストールしてください。

Apache の他にインストールする必要があるのは公式リポジトリsubversion だけです。

Subversion の設定

リポジトリのディレクトリを作成してください:

# mkdir -p /home/svn/repositories

/etc/httpd/conf/httpd.conf の編集

以下の行が記述されていることを確認してください。記述されていない場合、追加してください (普通は追加する必要があるのは最後の2行だけです)。記述の順番も守ってください:

LoadModule dav_module           modules/mod_dav.so
LoadModule dav_fs_module        modules/mod_dav_fs.so
LoadModule dav_svn_module       modules/mod_dav_svn.so
LoadModule authz_svn_module     modules/mod_authz_svn.so

SSL の設定

SVN にアクセスするのに SSL を使うことにはメリットがあります。例えば Apache の AuthType Basic を使うことができ、パスワードが漏洩する可能性が低くなります。

以下のコマンドで証明書を作成:

# cd /etc/httpd/conf/
# openssl req -new -x509 -keyout server.key -out server.crt -days 365 -nodes

/etc/httpd/conf/extra/httpd-ssl.conf (もしくは ssl を使わない場合 /etc/httpd/conf/extra/httpd-vhosts.conf) に以下を追加してください。バーチャルホストのディレクティブの中に記述します:

<Location /svn>
   DAV svn
   SVNParentPath /home/svn/repositories
   AuthzSVNAccessFile /home/svn/.svn-policy-file
   AuthName "SVN Repositories"
   AuthType Basic
   AuthUserFile /home/svn/.svn-auth-file
   Require valid-user
</Location>

SSL の設定がロードされるように、/etc/httpd/conf/httpd.conf の SSL を設定する行をアンコメントして以下のようにしてください:

Include /etc/httpd/conf/extra/httpd-ssl.conf

/home/svn/.svn-policy-file の作成

[/]
* = r

[REPO_NAME:/]
USER_NAME = rw

/ セクションの * は匿名ユーザーにマッチします。apache の AuthType Basic によって、読み取り以外のアクセスをしようとするとユーザー/パスワードの入力が求められます。REPO_NAME:/ セクションは上のセクションからパーミッションを承継するため、匿名ユーザーは読み込むだけの権限しか与えられません。最後にユーザー USER_NAME に REPO_NAME リポジトリの読み書き権限を付与しています。

/home/svn/.svn-auth-file の作成

htpasswd あるいは htdigest ファイルです。以下では htpasswd を使います。SSL があるためパスワードが盗聴されることを心配する必要はありません。htdigest は盗聴に対してさらに高いセキュリティを実現します。以下のコマンドを実行してください:

# htpasswd -cs /home/svn/.svn-auth-file USER_NAME

上記のコマンドでファイルが作成され (-c)、SHA-1 を使ってパスワードが保存されます (-s)。ユーザー USER_NAME が作られます。

ユーザーを追加するには、フラグを外してください (-c):

# htpasswd -s /home/svn/.svn-auth-file OTHER_USER_NAME

リポジトリの作成

# svnadmin create /home/svn/repositories/REPO_NAME

パーミッションの設定

新しいリポジトリに Apache ユーザーのパーミッションを設定してください。

# chown -R http:http /home/svn/repositories/REPO_NAME

プロジェクトの作成

プロジェクトのディレクトリ構造

開発用マシンに branches, tags, trunk の一時ディレクトリを作成してください:

$ mkdir -p ~/svn-import/{branches,tags,trunk}

ディレクトリの作成

プロジェクトのソースファイルを作成した trunk ディレクトリにコピー・移動してください:

$ cp -R /my/existing/project/* ~/svn-import/trunk

プロジェクトのインポート

$ svn import -m "Initial import" ~/svn-import https://yourdomain.net/svn/REPO_NAME/

SVN チェックアウトのテスト

$ svn checkout https://yourdomain.net/svn/REPO_NAME/ /my/svn/working/copy

ちゃんと設定ができていれば、作成された SVN リポジトリのコピーをチェックアウトできるはずです。

Svnserve のセットアップ

パッケージのインストール

公式リポジトリから subversion をインストールしてください。

リポジトリの作成

リポジトリを作成:

# mkdir /path/to/repos/
# svnadmin create /path/to/repos/repo1

最初のリポジトリは空です。ファイルをインポートしたい場合、以下のコマンドを使用:

$ svn import ~/code/project1 file:///path/to/repos/repo1 --message 'Initial repository layout'

アクセスポリシーの設定

/path/to/repos/repo1/conf/svnserve.conf ファイルを編集して [general] 下で以下の行をアンコメント・追加してください:

password-db = passwd

また、匿名ユーザーのデフォルトオプションを変更することができます:

anon-access = read

"read" を "write" に置き換えると誰でもコミットできるようになります。あるいは "none" に設定すると匿名のアクセスが全くできなくなります。

そして /path/to/repos/repo1/conf/passwd ファイルを編集してください:

[users]
harry = foopassword
sally = barpassword

上記では harry と sally というユーザーを定義して、それぞれパスワードを foopassword と barpassword に設定しています。適当に設定してください。

サーバーデーモンの起動

サーバーを起動する前に、設定ファイルを編集してください:

/etc/conf.d/svnserve
SVNSERVE_ARGS="--root=/path/to/repos"

--root=/path/to/repos オプションはリポジトリツリーのルートディレクトリを設定します。リポジトリが複数ある場合は --root=/path-to/reposparent を使ってください。URL にリポジトリの名前を指定することで各自のリポジトリにアクセスできます: svn://host/repo1。リポジトリのファイルに読み書きアクセスできることを確認してください。

別のポートを使いたい場合は --listen-port を追加してください。

デフォルトでは、サービスは root で実行されます。実行するユーザーを変更するには、ドロップインスニペットを作成:

/etc/systemd/system/svnserve.service.d/50-custom.conf
[Service]
User=svn

svnserve.service デーモンを起動してください。

svn+ssh

svn+ssh:// を使うには svnserve のラッパーが必要です。

svnserve バイナリがどこにあるか確認:

# which svnserve
/usr/local/bin/svnserve

ラッパーを作成:

# touch /usr/bin/svnserve
# chmod 755 /usr/bin/svnserve 

ラッパーを以下のように編集:

/usr/bin/svnserve 
#!/bin/sh
# wrapper script for svnserve
umask 007
/usr/local/bin/svnserve -r /path/to "$@"

新しいラッパースクリプトを使って svnserve を起動 (デーモンモード):

# /usr/bin/svnserve -d

リモートユーザーで確認ができます:

$ svn ls svn+ssh://server.domain.com:/reponame
++server.domain.com++
dev/
qa/
release/

Subversion のバックアップとリストア

Subversion リポジトリをバックアップするには、リポジトリごとに以下を実行してください:

$ svnadmin dump /path/to/reponame > /tmp/reponame.dump
$ scp -rp /tmp/reponame.dump user@server.domain.com:/tmp/

バックアップをリストアするには、まずリストアするリポジトリを作成します:

# svnadmin create /path/to/reponame

そして svn の dump を新しいリポジトリにロードさせてください:

# svnadmin load /path/to/reponame < /tmp/repo1.dump

パーミッションを設定:

# chown -R svn:svnusers /path/to/reponame
# chmod -R g+w /path/to/reponame/db/

これでリポジトリが設定されたはずです。

Subversion クライアント

Subversion のクライアントのリストは Wikipedia の記事を見てください。

参照