| ホーム >> | プログラミング >> | Subversion |
Subversion はプログラムソースを管理するためのソフトウエアです。プログラムの変更履歴やコメントを残す事が出来るので、将来過去のファイルが必要になった場合でも日付を与えてその当時のファイルを取得することが出来ます。
Subversionのサーバー側にはウェブサーバーのApache が必要です。Apache のインストール方法はApacheのページを見てください。
目次
Tips
Subversionの公式サイトからソースコードを取得します。インストール方法は次の通です。tarアーカイブの解凍などは省略しています。configureのオプションでapxsの位置を指定しますので、あらかじめApacheをインストールしておきます。ここではApacheのバージョン2を/usr/local/apache2/以下にインストールしていると仮定しています。
$ ./configure --with-apxs=/usr/local/apache2/bin/apxs
$ make
# make install
ここでは Mac OS X 10.4.9 におけるコンパイル例を示していますが、Linuxなど他のUNIX系の環境でも同じだと思います。
Subversionのサーバーには WebDAV という機能を使ってアクセスします。WebDAVを使うための設定をApacheに対して行います。Apacheの設定ファイルはhttpd.conf です。通常は/usr/local/apache2/conf/httpd.confにあります。httpd.confをエディタで開いて、ファイルの最後に次のように記入します。
<Location /svnroot>
Options Indexes
DAV svn
SVNParentPath /usr/local/svnroot
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /usr/local/apache2/password/svn_password
Require valid-user
</Location>
アクセス認証のためのパスワードファイルは /usr/local/apache2/password/svn_passwordとしました。 もちろんこれ以外の好きな場所に置いてもかまいませんが、ブラウザからは直接アクセス出来ない所に置く方が良いでしょう。パスワードファイルを作成するには htpasswd コマンドを用います。htpasswdはApacheと共にインストールされます。ここではユーザー名をfooとしています。
$ cd /usr/local/apache2
$ mkdir password
$ /usr/local/apache2/bin/htpasswd -c password/svn_password foo
ここまでせっていが終了したら、Apacheを再起動します。
# /usr/local/apache2/bin/apachectl restart
Subversionのサーバーにリポジトリ“myproj”を作成します。リポジトリとはサーバー上にあるファイルの保管場所です。まずサーバーにログインした状態からはじめます。Apacheをインストールする時にapacheというユーザーを作成しますが、Subversionのリポジトリもそのユーザーapacheによって管理されているとします。リポジトリを配置する場所は/usr/loca/svnrootとしました。
リポジトリの保存形式としてBerkekey DBとFSFSを選択出来ます。ここではFSFSを使うことにします。それぞれの利点欠点について興味が有るならメーリングリストSubversion-jpのログを読みましょう。
apache$ cd /usr/local/svnroot
apache$ svnadmin create --fs-type=fsfs myproj
次に、登録したプロジェクト内にディレクトリを作成します。プロジェクトが分岐する場合も考えて、以下の3つのディレクトリを作成します。ここからはSubversionのサーバーではなく、クライアントから作業します。クライアントがサーバーと別のコンピュータの場合は、クライアント側にもSubversionをインストールする必要があります。
trunk : 開発を進めていくファイルを入れておく。
branches : 分岐した時のブランチを入れる。
tags : 安定版のリリースなどタグを付けたものを入れる。
ディレクトリの作成は svn mkdir コマンドを用います。
$ svn mkdir http://svn.example.com/svnroot/myproj/trunk
$ svn mkdir http://svn.example.com/svnroot/myproj/branches
$ svn mkdir http://svn.example.com/svnroot/myproj/tags
作成したソースコードやテキストファイルなどをリポジトリに登録するには svn import コマンドを使います。クライアント上のディレクトリ myproj 内にソースコードがあるとします。
myproj/main.c
myproj/init.c
myproj/....
myproj以下のファイルをリポジトリの trunk 以下に登録します。
$ svn import myproj http://svn.example.com/svnroot/myproj/trunk
CVSの場合にはカレントディレクトリにあるファイル群が登録されますが、subversionではディレクトリを指定することで、そのディレクトリ内のファイルを登録出来ます。
ソースコードを取得するには、svn checkout コマンドを用いて作業用のコピーを取り出します。
$ svn checkout http://svn.example.com/svnroot/myproj/trunk myproj
作業コピー内には .svn/ が作られ、subversionの情報が格納されます。
特定のリビジョンのソースを取得するには、スイッチ --revision (-r) で指定します。
svn checkout -r 123 http://svn.example.com/svnroot/myproj/trunk myproj
特定の日付のソースを取得するには、スイッチ --revision (-r) に中括弧をつけて日付を指定します。例えば2006年12月8日のコードを取得するには、
svn checkout -r {20061208} http://svn.example.com/svnroot/myproj/trunk myproj
とします。
リポジトリに登録されているファイルの一覧を取得するには svn list コマンドを用います。
$ svn list http://svn.example.com/svnroot/myproj/trunk
作業コピーを編集した後、その変更内容をリポジトリに反映させるには svn commit コマンドを用います。commitの後にファイル名を続けると指定したファイルのみを登録する事が出来ます。
$ svn commit file.c
ファイル名を書かなければ、全ての変更内容が登録されます。
$ svn commit
複数のユーザーが同時に作業ファイルを編集している場合や、異なるコンピュータで同時に編集を行っている場合などには、作業ファイルを取得後にリポジトリの内容が変更されている事があります。リポジトリの最新の内容を作業コピーに反映させるには svn update コマンドを用います。
$ svn update
$ svn info
$ svn status
ファイルの頭に付いているマークの意味はヘルプで確認できます。
$ svn status --help
commitする時に記入したメッセージを確認できます。
$ svn log main.c
修正中のファイルについて、リポジトリ内のファイルとの差分を表示します。
$ svn diff main.c
リポジトリ内に存在しないファイルを新規に登録するには svn add コマンドを用います。次回 svn commit を実行した時にリポジトリ内に登録されます。
$ svn add sub.c
$ svn commit
一度 add した後で commit する前に追加を取り消したい時には svn revert コマンドを使います。ファイル名を指定しなければ、全てのファイルがリポジトリの状態に戻ってしまうので注意しましょう。
$ svn revert sub.c
$ svn mkdir subdir
$ svn commit
$ svn delete sub.c
このコマンドを実行すると、作業コピーからファイルが削除される。さらに、
$ svn commit
とするとリポジトリからも削除される。履歴は残っているので、過去のバージョンを指定すれば消したファイルも取得できる。
$ svn copy sub.c sub2.c
$ svn move sub.c sub2.c
これはcopyした後、元のファイルをdeleteした場合と同じです。
$ svn revert main.c
テスト的なことを行う時には、本筋からブランチを作成してそちらに手を入れるようにします。ブランチを作るにはcopyコマンドを使います。
$ svn copy http://svn.example.com/svnroot/myproj/trunk http://svn.example.com/svnroot/myproj/branches/test
これでbranches/testが作成されるので、こちらをcheckoutします。
プログラムの安定版ができた時などには、バージョン番号を付けてtagの下に置いておきます。方法はブランチを作る時と同じです。
$ svn copy http://svn.example.com/svnroot/myproj/trunk http://svn.example.com/svnroot/myproj/tags/1.0
ファイル ~/.subversion/servers で設定します。
[global]
http-proxy-exception = プロキシを通さないホスト名
http-proxy-host = プロキシサーバのホスト名
http-proxy-port = プロキシサーバのポート番号
リポジトリのバックアップ(ダンプファイル)を作成するには、サーバー上で svnadmin コマンドを使います。
$ svnadmin dump svnroot/myproj > myproj.dump
バックアップファイルからリポジトリを再生するには、まず新規にリポジトリをした後、バックアップファイルを読み込みます。
$ svnadmin create --fs-type=fsfs svnroot/myproj
$ svnadmin load svnroot/myproj < myproj.dump
ホスト名の変更などで、リポジトリの格納場所が変更になることがある。このときは、作業コピーにおいて
$ svn switch --relocate http://svn.example.com/svnroot/myproj/trunk http://other.example.com/svnroot/myproj/trunk
とする。
$ svnversion ./
ターミナルからコミットするときに、日本語を入力できるエディタが無かったり、文字コードの関係でうまくコミットできなかったりする場合には、あらかじめ作っておいたログメッセージを書き込んだファイルを読み込ませるようにするとうまくいくことがあります。
まず、Subversionのクライアント側の設定を行います。
~/.subversion/config
をエディタで開き、ログのエンコードをEUC-JPにします。
log-encoding = euc-jp
コメント用の文はあらかじめテキストエディットやEmacs.appなどで作成します。このとき文字コードはeuc-jpとします。
そして、コミットするときに--fileオプションを付けてこのファイルを読み込みます。
$ svn commit --file tmp.txt
ログがうまく入力できたかどうか確認するには、日本語表示に対応したターミナルから、
$ svn log | nkf -e
とします。
サーバーにログインした後、
$ svnadmin setlog --bypass-hooks [リポジトリ] -r [リビジョン番号] [ログファイル]
参考:気の向くままに…
リポジトリごとにアクセスできる人を制限することができます。
Apacheの設定ファイル httpd.conf の中に
LoadModule authz_svn_module modules/mod_authz_svn.so
を加えます。LoadModuleの記述があるところに並べておけばいいです。
Subversionのルートのパスは /usr/local/svnroot だとします。httpd.confにsvnrootの設定を行います。アクセス制御ファイルsvn.accessを作成して次のように AuthzSVNAccessFileで指定します。
<Location /svnroot>
Options +Indexes
DAV svn
SVNParentPath /usr/local/svnroot
AuthzSVNAccessFile /usr/local/apache2/password/svn.access
</Location>
<Location /svnroot/repo1>
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /usr/local/apache2/password/htpasswd_svn
Require valid-user
</Location>
<Location /svnroot/repo2>
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /usr/local/apache2/password/htpasswd_svn
Require valid-user
</Location>
httpd.confを編集し終えたら、httpdを再起動します。
# /usr/local/apache2/bin/apachectl restart
次のようにアクセス制御ファイルsvn.accessに書きます。
[/]
* =
[repo1:/]
foo = rw
guest = r
[repo2:/fig]
foo = rw
guest = rw
最初の2行は、Subversionのルートディレクトリについてのアクセス制限を表します。ここでは全てのユーザー(*)にアクセス権限が無いことを示しています。
3-4行目はリポジトリrepo1以下の全てのディレクトリに対して、ユーザーfooは読み書き権限を与え、ユーザーguestには読み込み権限のみを与えています。
5-6行目ではリポジトリrepo2以下にあるディレクトリfigに対して、foo, guest共に読み書きアクセスを与えています。