理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> プログラミング >> Subversion

バージョン管理システムSubversionの使い方

更新日:2008.1.20

Subversion はプログラムソースを管理するためのソフトウエアです。プログラムの変更履歴やコメントを残す事が出来るので、将来過去のファイルが必要になった場合でも日付を与えてその当時のファイルを取得することが出来ます。

Subversionのサーバー側にはウェブサーバーのApache が必要です。Apache のインストール方法はApacheのページを見てください。

目次

  1. Subversionをコンパイルする
  2. Apacheの設定を行う
  3. リポジトリの作成
  4. プロジェクトファイルの登録 (import)
  5. 作業コピーの取り出し (checkout)
  6. ファイルリストを見る (list)
  7. 変更内容をリポジトリに登録する (commit)
  8. 作業コピーを最新版にする (update)
  9. リポジトリの情報を表示する (info)
  10. 作業コピーの状態を表示する (status)
  11. 変更履歴を見る (log)
  12. 変更の差分を見る (diff)
  13. ファイルの追加 (add)
  14. ディレクトリの追加 (mkdir)
  15. ファイルを削除する (delete)
  16. ファイルをコピーする (copy)
  17. ファイル名を変更する (move)
  18. 作業コピーの変更を取り消してリポジトリの状態に戻す (revert)
  19. ブランチを作る (copy)
  20. タグを付ける (copy)
  21. PROXYサーバーを設定する
  22. バックアップ、リストアする (dump, load)
  23. リポジトリの格納場所を変更したい (switch)
  24. 作業コピーのリビジョンを確認する (svnversion)

Tips


Subversionをコンパイルする

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系の環境でも同じだと思います。

Apacheの設定を行う

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

プロジェクトファイルの登録 (import)

作成したソースコードやテキストファイルなどをリポジトリに登録するには svn import コマンドを使います。クライアント上のディレクトリ myproj 内にソースコードがあるとします。

myproj/main.c
myproj/init.c
myproj/....

myproj以下のファイルをリポジトリの trunk 以下に登録します。

$ svn import myproj http://svn.example.com/svnroot/myproj/trunk
CVSの場合にはカレントディレクトリにあるファイル群が登録されますが、subversionではディレクトリを指定することで、そのディレクトリ内のファイルを登録出来ます。

作業コピーの取り出し (checkout)

ソースコードを取得するには、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

とします。

ファイルリストを見る (list)

リポジトリに登録されているファイルの一覧を取得するには svn list コマンドを用います。

$ svn list http://svn.example.com/svnroot/myproj/trunk

変更内容をリポジトリに登録する (commit)

作業コピーを編集した後、その変更内容をリポジトリに反映させるには svn commit コマンドを用います。commitの後にファイル名を続けると指定したファイルのみを登録する事が出来ます。

$ svn commit file.c

ファイル名を書かなければ、全ての変更内容が登録されます。

$ svn commit

作業コピーを最新版にする (update)

複数のユーザーが同時に作業ファイルを編集している場合や、異なるコンピュータで同時に編集を行っている場合などには、作業ファイルを取得後にリポジトリの内容が変更されている事があります。リポジトリの最新の内容を作業コピーに反映させるには svn update コマンドを用います。

$ svn update

リポジトリの情報を表示する (info)

$ svn info

作業コピーの状態を表示する (status)

$ svn status

ファイルの頭に付いているマークの意味はヘルプで確認できます。

$ svn status --help

変更履歴を見る (log)

commitする時に記入したメッセージを確認できます。

$ svn log main.c

変更の差分を見る (diff)

修正中のファイルについて、リポジトリ内のファイルとの差分を表示します。

$ svn diff main.c

ファイルの追加 (add)

リポジトリ内に存在しないファイルを新規に登録するには svn add コマンドを用います。次回 svn commit を実行した時にリポジトリ内に登録されます。

$ svn add sub.c
$ svn commit

一度 add した後で commit する前に追加を取り消したい時には svn revert コマンドを使います。ファイル名を指定しなければ、全てのファイルがリポジトリの状態に戻ってしまうので注意しましょう。

$ svn revert sub.c

ディレクトリの追加 (mkdir)

$ svn mkdir subdir
$ svn commit

ファイルを削除する (delete)

$ svn delete sub.c

このコマンドを実行すると、作業コピーからファイルが削除される。さらに、

$ svn commit

とするとリポジトリからも削除される。履歴は残っているので、過去のバージョンを指定すれば消したファイルも取得できる。

ファイルをコピーする (copy)

$ svn copy sub.c sub2.c

ファイル名を変更する (move)

$ svn move sub.c sub2.c

これはcopyした後、元のファイルをdeleteした場合と同じです。

作業コピーの変更を取り消してリポジトリの状態に戻す (revert)

$ svn revert main.c

ブランチを作る (copy)

テスト的なことを行う時には、本筋からブランチを作成してそちらに手を入れるようにします。ブランチを作るにはcopyコマンドを使います。

$ svn copy http://svn.example.com/svnroot/myproj/trunk \
http://svn.example.com/svnroot/myproj/branches/test

これでbranches/testが作成されるので、こちらをcheckoutします。

タグを付ける (copy)

プログラムの安定版ができた時などには、バージョン番号を付けてtagの下に置いておきます。方法はブランチを作る時と同じです。

$ svn copy http://svn.example.com/svnroot/myproj/trunk \
http://svn.example.com/svnroot/myproj/tags/1.0

PROXYサーバーを設定する

ファイル ~/.subversion/servers で設定します。

[global]
http-proxy-exception = プロキシを通さないホスト名
http-proxy-host = プロキシサーバのホスト名
http-proxy-port = プロキシサーバのポート番号

バックアップ、リストアする (dump, load)

リポジトリのバックアップ(ダンプファイル)を作成するには、サーバー上で svnadmin コマンドを使います。

$ svnadmin dump svnroot/myproj > myproj.dump

バックアップファイルからリポジトリを再生するには、まず新規にリポジトリをした後、バックアップファイルを読み込みます。

$ svnadmin create --fs-type=fsfs svnroot/myproj
$ svnadmin load svnroot/myproj < myproj.dump

リポジトリの格納場所を変更したい (switch)

ホスト名の変更などで、リポジトリの格納場所が変更になることがある。このときは、作業コピーにおいて

$ svn switch --relocate http://svn.example.com/svnroot/myproj/trunk \
http://other.example.com/svnroot/myproj/trunk

とする。

作業コピーのリビジョンを確認する (svnversion)

$ svnversion ./

事前に準備したログコメントを読み込ませたい

作成日:2008.1.20

ターミナルからコミットするときに、日本語を入力できるエディタが無かったり、文字コードの関係でうまくコミットできなかったりする場合には、あらかじめ作っておいたログメッセージを書き込んだファイルを読み込ませるようにするとうまくいくことがあります。

まず、Subversionのクライアント側の設定を行います。

~/.subversion/config

をエディタで開き、ログのエンコードをEUC-JPにします。

log-encoding = euc-jp

コメント用の文はあらかじめテキストエディットやEmacs.appなどで作成します。このとき文字コードはeuc-jpとします。

そして、コミットするときに--fileオプションを付けてこのファイルを読み込みます。

$ svn commit --file tmp.txt

ログがうまく入力できたかどうか確認するには、日本語表示に対応したターミナルから、

$ svn log | nkf -e

とします。

ログコメントを修正したい

作成日:2008.1.20

サーバーにログインした後、

$ svnadmin setlog --bypass-hooks [リポジトリ] -r [リビジョン番号] [ログファイル]

▼参考サイト or 参考文献

リポジトリのアクセス制限

作成日:2008.1.20

参考:気の向くままに…

リポジトリごとにアクセスできる人を制限することができます。

モジュールの読み込み

Apacheの設定ファイル httpd.conf の中に

LoadModule authz_svn_module modules/mod_authz_svn.so

を加えます。LoadModuleの記述があるところに並べておけばいいです。

Subversionのルートを指定

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共に読み書きアクセスを与えています。