CentOS4/CentOS5 - subversionの導入

バージョン管理システムであるsubversionを導入します。
Windows版の導入記録はこちら

更新履歴


対象OS、バージョン

  • CentOS4/CentOS5

目標

WebDAV経由でリポジトリへのアクセスを行える様にします。
WebDAVを使うという事で、apache2の導入も必要になります。
先にapache2の導入を済ませてから行います。

導入

yumにて導入を行います。
rootにて以下を実行します。
# yum install subversion
これで、導入は完了です。

subversionを使ってみる

「sample」というプロジェクトのソースをsubversionで管理する様にします。
(リポジトリ名もsampleとする)
なお、sampleプロジェクトは以下の様なディレクトリ/ファイル構成とする。
sample
    +--src
        + aaaa.c
        + bbbb.c
        |
        + include
             +aaaa.h
             +bbbb.h
また、リポジトリの編成は以下の様にします。
sample/trunk        : 開発の主系
sample/branches     : ブランチのコピーを保持
sample/tags         : タグのコピーを保持
ここを参考に編成を構成しました。
編成は好みですが、subversion自身のリポジトリがいい参考になります。

リポジトリの作成

リポジトリの作成場所は、/home/svn/repos/sampleとします。
ディレクトリを作成後、リポジトリをcreateします。
rootにて以下を実行します。
# mkdir -p /home/svn/repos/sample
# svnadmin create /home/svn/repos/sample

リポジトリの編成/ソースの追加

リポジトリの編成及びソースの追加を行います。
編成及びソース追加を一度に行う場合は、「
リポジトリのインポート」で。

編成

sampleリポジトリにtrunk,branches,tagsディレクトリを作成します。
rootにて以下を実行します。
# svn mkdir file://localhost/home/svn/repos/sample/trunk -m "create"
# svn mkdir file://localhost/home/svn/repos/sample/branches -m "create"
# svn mkdir file://localhost/home/svn/repos/sample/tags -m "create"

ソースの追加

sampleプロジェクトのソース一式が/tmp/sample/以下にあると仮定します。
開発の主系であるtrunkにソース一式をインポートします。
#svn import /tmp/sample file://localhost/home/svn/repos/sample/trunk -m "import!!" 


リポジトリのインポート

リポジトリの編成/ソースの追加では編成・ソース追加と2回の手順で
作業を行いましたが、「リポジトリのインポート」を使えば1回で作業が完了します。
(ここを参考にしました)

イメージの展開

リポジトリの編成イメージで、作業用ディレクトリにイメージを展開します。
ここでは、/tmp以下を作業ディレクトリとします。
# mkdir -p /tmp/sample
# mkdir -p /tmp/sample/trunk
# mkdir -p /tmp/sample/branches
# mkdir -p /tmp/sample/tags

(*)/tmp/sample/trunk下に、sampleプロジェクトのファイル群を配置します。

インポート

以下を実行し、リポジトリにインポートする。
#svn import /tmp/sample file://localhost/home/svn/repos/sample/trunk -m "import!!" 


タグの作成/ブランチの作成

タグ/ブランチとはソースのある時点でのスナップショットです。
例えば、「バージョン1.5」の時点での全ソースを後から取得したい場合にあらかじめバージョン1.5時点
でのスナップショットを作成しておけば、いつでも取り出せます。
なお、subversionではタグ/ブランチの区別はありません。
(ブランチは、最終的にtrunkにマージされるはず・・)
要は「どう使うか」です。
リポジトリの構成で、タグはtags、ブランチはbranchesと決めたので、
それぞれの所に以下を実行してtrunkのある時点でのスナップショットを作成します。
#svn copy file://localhost/home/svn/repos/sample/trunk 
 file://localhost/home/svn/repos/sample/tags/release-1.5 -m "Release 1.0"

(*)実際は一行で・・
(*)赤字の部分が、branchesになったりします。
これで、Release1.5のタグが作成されました。


WebDAVでのリポジトリ公開

WebDAVでリポジトリを公開すべく、設定を行います。

mod_dav_svn の導入

yumにて導入を行います。
rootにて以下を実行します。
# yum install mod_dav_svn

設定

apache2用のsubversion設定ファイル(/etc/httpd/conf.d/subversion.conf)に対して
以下の設定を行う

Locationセクションの追加

以下を追加する。
<Location /svn/sample>
    DAV svn
    SVNPath /home/svn/repos/sample
</Location>


リポジトリのパーミッション変更

Apacheプロセスがリポジトリにアクセス(読み込み・書き込み)ができる様に
適切にパーミッションを変更します。
# chown -R apache:apache /home/svn/repos/sample

SELinuxの為の設定

SELinuxが有効(Enforcing)の場合、/home/svn/repos以下に対して、ラベルを付与し
アクセス可能となる様にする。
# chcon -R -h -t httpd_sys_content_t /home/svn/repos

apache2の再起動

apache2を再起動する
# /etc/rc.d/init.d/httpd restart

動作確認

ブラウザで、http://localhost/svn/sample/ にアクセスすると、リポジトリが表示されます。


WebDAVアクセス認証

WebDAVでのリポジトリ公開の設定では、全ての人がリポジトリの参照及び更新ができてしまいます。
これではまずいので、細かい認証の設定例を記載する。
(ここを参考にしました)

authzsvn.confの作成

/home/svn/repos/sample/authzsvn.confを以下の様な内容で作成します。
[groups]
#開発者
developers = foo, bar
#管理者
manager = foo
[/]
#すべての人が読み込み可能
* = r
[sample:/trunk]
#開発者は読み書き可能
@developers = rw
[sample:/branches]
#管理者は書き込みも可能
@manager = rw
[sample:/tags]
#管理者は書き込みも可能
@manager = rw
リポジトリ管理者をfoo , 開発者をfoo,barとして定義してます。
その他(匿名ユーザ)は読み込み専用とし、foo,barはtrunk下の読み書き可能
fooユーザは、branches,tags下の読み書きが可能となる

匿名アクセスの設定例

すべての人に対して自由にアクセスすることを許します。ユーザは匿名で扱われます。
apache2用のsubversion設定ファイル(/etc/httpd/conf.d/subversion.conf)を
以下の様に再定義します。
<Location /svn/sample>
    DAV svn
    SVNPath /home/svn/repos/sample

    # our access control policy
    AuthzSVNAccessFile /home/svn/repos/sample/authzsvn.conf
</Location>

認証つきアクセスの設定例

すべての人に対して認証を求めます。
apache2用のsubversion設定ファイル(/etc/httpd/conf.d/subversion.conf)を
以下の様に再定義します。
<Location /svn/sample>
    DAV svn
    SVNPath /home/svn/repos/sample

    # our access control policy
    AuthzSVNAccessFile /home/svn/repos/sample/authzsvn.conf

    # only authenticated users may access the repository
    Require valid-user

    # how to authenticate a user
    AuthType Basic
    AuthName "Subversion repository(sample)"
    AuthUserFile /home/svn/repos/sample/.htpasswd
</Location>

(*) htpasswdの作成は、
      #/usr/bin/htpasswd -c /home/svn/repos/sample/.htpasswd foo
    でOK。

認証つき/匿名の両方でアクセスする場合の設定例

読み込み時は匿名でアクセスするが、更新時に認証を聞いてくる様な設定です。
apache2用のsubversion設定ファイル(/etc/httpd/conf.d/subversion.conf)を
以下の様に再定義します。
<Location /svn/sample>
    DAV svn
    SVNPath /home/svn/repos/sample

    # our access control policy
    AuthzSVNAccessFile /home/svn/repos/sample/authzsvn.conf

    # try anonymous access first, resort to real
    # authentication if necessary.
    Satisfy Any
    Require valid-user

    # how to authenticate a user
    AuthType Basic
    AuthName "Subversion repository(sample)"
    AuthUserFile /home/svn/repos/sample/.htpasswd
</Location>


SVNクライアント

TortoiseSVN

SubversionのGUIクライアントです。
Windows版です。導入方法はこちらです。

その他

コミットログを変更できる様にする為には

TortoiseSVN等で、コミットログを変更できる様にする為には、
サーバ側で設定が必要になります。
設定は以下になります。

pre-revprop-changeの配置

リポジトリの作成場所の下に、hookディレクトリがあります。
(上述リポジトリの作成例で言えば、/home/svn/repos/sample/hookになる)
このhookディレクトリ内に、
pre-revprop-change.tmpl
というファイルがありますので、これを、
pre-revprop-change
にリネームするかコピーして、hookディレクトリ内に配置します。

以上で、TortoiseSVN等からコミットログの変更は可能となります。

特定ディレクトリ以下を参照不可にしたい

Subversionを使って会社間で共同開発する場合、見られたくないドキュメント等があると思います。
ここでは、特定ディレクトリ以下についてのみ特定グループの人のみ参照不可とする為の設定を行います。
(ディレクトリの存在そのものが知られる事はありません)

想定するディレクトリ構成

以下の様なディレクトリ構成を仮定し、「local」ディレクトリ以下は協力会社には見えない様に設定します。
sample
    +trunk
       +--src
           + aaaa.c
           + bbbb.c
              :  :
              :  :
       +--docs
           + 設計書.xls
              :  :
       +--local            <-- ここから下を不可視にする。
           + 見積書.xls
              :  :

authzsvn.confの設定

協力会社のグループを「partner」として設定し、authzsvn.confを以下の様に設定します。
(リポジトリ名は「sample」です)
[groups]
#開発者のアカウント (staff1,staff2,staff3というアカウントを定義)
developers = staff1, staff2, staff3
#管理者のアカウント (oresamaというアカウントを定義)
manager = oresama
#協力会社のアカウント (other1,other2というアカウントを定義)
partner = other1, other2
[/]
@manager = rw
[sample:/trunk]
@developers = rw
@manager = rw
@partner = rw

# パートナーは、/trunk/local以下のアクセスは拒否
[sample:/trunk/local]
@partner =

これで、trunk/local以下は協力会社からは存在さえ気付かれないはずです。