「Subversion」の版間の差分
(en:Subversion Setupへの転送ページ) |
|||
1行目: | 1行目: | ||
+ | [[Category:バージョン管理システム]] |
||
− | #redirect[[en:Subversion Setup]] |
||
+ | [[Category:ウェブサーバー]] |
||
+ | [[de:Apache Subversion]] |
||
+ | [[en:Subversion Setup]] |
||
+ | [[zh-CN:Subversion Setup]] |
||
+ | [http://subversion.apache.org/features.html Apache Subversion] はより良い [[en2:Concurrent Versions System|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 の他にインストールする必要があるのは[[公式リポジトリ]]の {{Pkg|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 |
||
+ | |||
+ | {{ic|/etc/httpd/conf/extra/httpd-ssl.conf}} (もしくは ssl を使わない場合 {{ic|/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 の設定がロードされるように、{{ic|/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 |
||
+ | |||
+ | 上記のコマンドでファイルが作成され ({{ic|-c}})、SHA-1 を使ってパスワードが保存されます ({{ic|-s}})。ユーザー {{ic|USER_NAME}} が作られます。 |
||
+ | |||
+ | ユーザーを追加するには、フラグを外してください ({{ic|-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 |
||
+ | |||
+ | ===プロジェクトの作成=== |
||
+ | ====プロジェクトのディレクトリ構造==== |
||
+ | 開発用マシンに {{ic|branches}}, {{ic|tags}}, {{ic|trunk}} の一時ディレクトリを作成してください: |
||
+ | $ mkdir -p ~/svn-import/{branches,tags,trunk} |
||
+ | |||
+ | ====ディレクトリの作成==== |
||
+ | プロジェクトのソースファイルを作成した {{ic|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 のセットアップ == |
||
+ | |||
+ | ===パッケージのインストール=== |
||
+ | [[公式リポジトリ]]から {{Pkg|subversion}} をインストールしてください。 |
||
+ | |||
+ | === リポジトリの作成 === |
||
+ | |||
+ | リポジトリを作成: |
||
+ | # mkdir /path/to/repos/ |
||
+ | # svnadmin create /path/to/repos/repo1 |
||
+ | |||
+ | 最初のリポジトリは空です。ファイルをインポートしたい場合、以下のコマンドを使用: |
||
+ | $ svn import ~/code/project1 file:///path/to/repos/repo1 --message 'Initial repository layout' |
||
+ | |||
+ | === アクセスポリシーの設定 === |
||
+ | |||
+ | {{ic|/path/to/repos/repo1/conf/svnserve.conf}} ファイルを編集して [general] 下で以下の行をアンコメント・追加してください: |
||
+ | password-db = passwd |
||
+ | |||
+ | また、匿名ユーザーのデフォルトオプションを変更することができます: |
||
+ | anon-access = read |
||
+ | "read" を "write" に置き換えると誰でもコミットできるようになります。あるいは "none" に設定すると匿名のアクセスが全くできなくなります。 |
||
+ | |||
+ | そして {{ic|/path/to/repos/repo1/conf/passwd}} ファイルを編集してください: |
||
+ | [users] |
||
+ | harry = foopassword |
||
+ | sally = barpassword |
||
+ | |||
+ | 上記では harry と sally というユーザーを定義して、それぞれパスワードを foopassword と barpassword に設定しています。適当に設定してください。 |
||
+ | |||
+ | === サーバーデーモンの起動 === |
||
+ | |||
+ | サーバーを起動する前に、設定ファイルを編集してください: |
||
+ | |||
+ | {{hc|/etc/conf.d/svnserve|2= |
||
+ | SVNSERVE_ARGS="--root=/path/to/repos" |
||
+ | }} |
||
+ | |||
+ | {{ic|1=--root=/path/to/repos}} オプションはリポジトリツリーのルートディレクトリを設定します。リポジトリが複数ある場合は {{ic|1=--root=/path-to/reposparent}} を使ってください。URL にリポジトリの名前を指定することで各自のリポジトリにアクセスできます: {{ic|svn://host/repo1}}。リポジトリのファイルに読み書きアクセスできることを確認してください。 |
||
+ | |||
+ | 別のポートを使いたい場合は {{ic|--listen-port}} を追加してください。 |
||
+ | |||
+ | デフォルトでは、サービスは root で実行されます。実行するユーザーを変更するには、ドロップインスニペットを作成: |
||
+ | |||
+ | {{hc|/etc/systemd/system/svnserve.service.d/50-custom.conf|2= |
||
+ | [Service] |
||
+ | User=svn |
||
+ | }} |
||
+ | |||
+ | {{ic|svnserve.service}} [[デーモン]]を起動してください。 |
||
+ | |||
+ | === svn+ssh === |
||
+ | svn+ssh:// を使うには svnserve のラッパーが必要です。 |
||
+ | |||
+ | svnserve バイナリがどこにあるか確認: |
||
+ | {{hc|# which svnserve|/usr/local/bin/svnserve}} |
||
+ | |||
+ | ラッパーを作成: |
||
+ | # touch /usr/bin/svnserve |
||
+ | # chmod 755 /usr/bin/svnserve |
||
+ | |||
+ | ラッパーを以下のように編集: |
||
+ | |||
+ | {{bc|/usr/bin/svnserve |
||
+ | #!/bin/sh |
||
+ | # wrapper script for svnserve |
||
+ | umask 007 |
||
+ | /usr/local/bin/svnserve -r /path/to "$@" |
||
+ | }} |
||
+ | |||
+ | 新しいラッパースクリプトを使って svnserve を起動 (デーモンモード): |
||
+ | # /usr/bin/svnserve -d |
||
+ | |||
+ | リモートユーザーで確認ができます: |
||
+ | |||
+ | {{bc|$ <nowiki>svn ls svn+ssh://server.domain.com:/reponame</nowiki> |
||
+ | ++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:Comparison of Subversion clients|Wikipedia の記事]]を見てください。 |
||
+ | |||
+ | == 参照 == |
||
+ | * http://svnbook.red-bean.com/en/1.1/svn-book.html#svn-ch-9-sect-2.2-re-load |
||
+ | * http://subversion.tigris.org/ |
2016年1月11日 (月) 19:19時点における版
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 の記事を見てください。