2008/03/28(金)Subversionの設定メモ

リポジトリ管理にもっぱら Subversion を使っているのですが、管理方法などを細かいことを忘れてしまうので、備忘録メモです。

Apacheの設定

svn のリポジトリを http で管理する場合、Apacheにモジュールを組み込む必要があります。

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

svnを動作させたいディレクトリを指定し、次のように記述します。

<Location /repo-dir>
    DAV     svn
    SVNPath /var/www/svndata/repo-dir
</Location>

このとき、/repo-dir/ がsvnリポジトリとして扱われ、/repo-dir/ 以下の管理情報はすべて /var/www/svndata/repo-dir に置かれます。

また /repo-dir/ という実ディレクトリ(www内)が存在すると問題が起こります。

SVNPathで指定したディレクトリに実際にリポジトリを作成します。このリポジトリデータは www 権限で読み書きできる必要があります。

# svnadmin create /var/www/svndata/repo-dir
# chown -R www:www /var/www/svndata/repo-dir

リポジトリのディレクトリ分け

これまでの設定により http://svn.duummy.dom/repo-dir は1つのSubversionリポジトリとして機能します。Subversionによって /repo-dir の仮想的なファイルシステムがすべて作られるようになります。

ずっと勘違いをしていたのですが、あるプログラムを開発するとき、/repo-dir 自体を1つのプログラムソース全体として管理していました。

  • repo-dir/
    • Makefile
    • main.c

しかし、この状況ではブランチといったプロジェクトの分岐が不可能になってしまいます。

これを次のような形で行えば、この中には自由にディレクトリやファイルを作ることができ、コピー等も自在に行えます。

  • repo-dir/
    • prog-current/
      • Makefile
      • main.c
    • prog-stable/
      • Makefile
      • main.c

リポジトリというのは単なる管理単位で、その中のいかなるサブディレクトリでも、そのサブディレクトリ単位でチェックアウトやインポートなどが実効できます。実際、複数のプロジェクトからなる大きな1つのプロジェクトは、このようなディレクトリ分けをうまく使うことで管理されます。

補足

これはリポジトリの概念を解説しただけで、コメントで頂いたとおり下のようにするのが一般的です(必ずしも従う必要はありませんが)。詳しくは参考資料をご覧ください。

  • trunk ……現在開発中のもの
  • branches ……ブランチを納めるディレクトリ
    • branch1
    • branch2
  • tags ……タグをつけてリリース版などをおく場所*1
    • Version 1.xxxx

*1 : 実体はブランチと同じ、ある時点でのディレクトリのコピー

リポジトリの登録とコピー

登録は(通常)手元にあるファイルを import によりリポジトリに登録します。

$ svn import local-dir http://svn.duummy.dom/repo-dir/prog-current

今登録したリポジトリをマスターとして使用しますので、(面倒でも)一度リポジトリから手元のディレクトリにコピーする必要があります。

$ svn checkout http://svn.duummy.dom/repo-dir/prog-current

リポジトリを分岐(ブランチ)させたいときは、同一リポジトリ内でコピーします。

$ svn copy http://svn.duummy.dom/repo-dir/prog-current
           http://svn.duummy.dom/repo-dir/prog-stable

クライアント側の操作

一度チェックアウトしてしまえば、あとは簡単です。チェックアウトしたディレクトリに移動し(prog-current/等)て操作します。

最新のソースに追従
$ svn update
変更箇所をリポジトリに反映
$ svn ci -m "チェックインのメモ"

特定ファイルの変更を破棄
$ svn revert file.c
ファイル/ディレクトリを削除
$ svn delete file.c
ファイル/ディレクトリを追加
$ svn add file.c

差分表示
$ svn diff
リビジョン指定して差分表示(13とローカルのもの)
$ svn diff -r13
リビジョン指定して差分表示(11と12)
$ svn diff -r11:12

作業コピーのブランチ切り替え
$ svn switch http://svn.duummy.dom/repo-dir/prog-stable

参考資料