Subversion をインストールする
以前、 RCS というプログラムをご紹介したのを覚えているでしょうか。 Gentoo Linux で設定ファイルの履歴管理を実現するために使われている、最もシンプルなバージョン管理システムです。 RCS は手軽に単独のファイルの履歴を残すには便利なプログラムですが、プロジェクト全体のソースコード管理などに適用するにはちょっと苦しいものがあります。
本日は、そんな大規模な用途にもじゅうぶん耐えられる本格的なバージョン管理システムのひとつ、 Subversion をご紹介したいと思います。これまでも Tips のようなものはいくつか記事にしましたが、そろそろきちんとご紹介しておこうかな、というところです(^^ゞ。
Subversion の特徴
Subversion はオープンソースのバージョン管理システムの中でも最も有力なもののひとつで、有名どころでは Apache Foundation の各プロジェクトが Subversion を使用しています。以下のような特徴を持っています。
- アトミックなコミット(複数ファイルを更新する際に割り込まれることがありません)
- ディレクトリのバージョニングに対応
- サーバーを構築せずに、ローカルだけでも使える
- SSH, WebDAV などのプロトコルを使用し、ネットワーク経由でリポジトリにアクセス可能
- API が公開されており、(コマンドラインラッパーではない)GUI などの開発が可能
- Perl, Python API をサポート(Subversion 1.3 からは Ruby API も整備されています)
- 基本はマージモデルだが、必要に応じてロックも可能
全体的に分散リポジトリなどの先進的な機能を追い求めることはせず、従来からのバージョン管理をより良い形で実装することに重きを置いているようです。それだけに動作も安定していて、使いやすいバージョン管理システムです。
インストール
それではインストールしてみましょう。ここでは Gentoo Linux を前提にしていますが、他のディストリビューションでも大抵はパッケージが用意されていると思いますので、それを使えば簡単にインストールできると思います。
USE フラグの設定
Gentoo Linux では、 USE フラグというものでインストールするアプリケーションの各種機能を選択できます。 Subversion に影響する主な USE フラグには以下のものがあります。
USEフラグ | 機能 |
---|---|
apache2 | Apache の mod_webdav_svn モジュールをビルドします |
berkdb | Berkeley DB 形式のリポジトリを利用可能にします |
extras | 追加のスクリプトやツールなどをインストールします |
java | Java バインドをインストールします |
nls | 多言語対応 |
nowebdav | WebDAV 経由でのリポジトリアクセス機能を無効にします |
perl | Perl バインドをインストールします |
python | Python バインドをインストールします |
ruby | Ruby バインドをインストールします |
svnserve | サーバー関連のスクリプトをインストールします |
zlib | zlib での圧縮機能を有効にします |
少なくとも nls, svnserve, zlib あたりは有効にしておくことをお勧めします。 "/etc/portage/package.use" に以下の行を追加すればよいでしょう。
dev-util/subversion nls svnserve zlib
上記以外のフラグも、お好みで追加してください。
パッケージのインストール
Gentoo Linux では、単に emerge を実行するだけでインストールできます。
emerge dev-util/subversion
emerge が終了すれば、普通に Subversion が使えるようになっているはずです。
日本語化
Subversion は標準で表示メッセージを日本語化できます(要 nls USE フラグ)。方法は、単純に LANG 環境変数にロケールを設定するだけです。例えば、コンソールの文字コードが UTF-8 のときは以下のように設定します。
export LANG=ja_JP.utf8
もっとも、大抵はすでに設定してあると思いますので、その場合は最初から日本語メッセージが表示されます。 UTF-8 以外の文字コードは試していませんが、iconv を使っているので eucjp や sjis, jis などほとんどの文字コードが有効なはずです。
以上で Subversion のインストールは終了です。
使ってみる
せっかくインストールしたので、ちょっと使ってみましょう。といっても、なにかバージョン管理するファイルがないと話が始まりません。ここでは、ホームディレクトリの設定ファイルをバージョン管理してみようと思います。ちょっと変則的な使い方になっている部分もありますので、スタンダードな使用方法を知りたい方はSubversion によるバージョン管理の同伴ツアーあたりを読んでみてください。
それでは、始めましょう!
リポジトリの初期化
まずは、リポジトリを作成しなければなりません。リポジトリとは、ファイルの履歴情報を格納するデータベースのようなもので、 Subversion が扱う情報はすべてここに保存されます。
リポジトリを作成するには、まずリポジトリを格納するディレクトリを作成し、その内容を svnadmin コマンドで初期化します。書式は以下のとおりです。
svnadmin create リポジトリのパス
例として、"~/svn" にリポジトリを作成するには以下のようにします。
cd ~ mkdir svn svnadmin create svn
リポジトリは必要に応じて複数作ることも可能です。ただし、リポジトリ間でファイルをやり取りするのは面倒なので、あまり細かく分けるのは得策ではありません。プロジェクト単位など、ある程度大きなまとまりで作るのが良いと思います。
ファイルを登録する
リポジトリを作成したら、バージョン管理したいファイルを登録しますします。これ以降、ほとんどの操作は svn コマンドを使って行います。 svn コマンドの基本的な書式は以下のようになります。
svn サブコマンド [サブコマンド依存のパラメータ]
バージョン管理のほとんどの機能が svn コマンドにまとめられているので、実行する操作を指定するために多くのサブコマンド が用意されています。すべてのサブコマンドのリストは "svn help" で確認できます。また、"svn help サブコマンド" で各サブコマンドのヘルプが表示されます。
リポジトリにファイルを登録するサブコマンドは import です。ホームディレクトリが "/home/hokousya" だとすると、以下のコマンドで "~/.bashrc" と "~/.bash_profile" を登録することができます。
svn import -m "Import .bashrc" \ .bashrc file:///home/hokousya/svn/current
-m オプションはコメントの指定です。コメントはログとして記録され、後で参照できます。なるべくわかりやすく記述したほうが後々のためですよ(^^;
また、上記のコマンドで "file:///home/hokousya/svn/current" とあるのはリポジトリの URL です。 Subversion はローカルファイルシステムのリポジトリだけでなく、さまざまなプロトコルを介してリモートホストのリポジトリにもアクセスできます。そのため、それらを一意に識別できる URL を用いてリポジトリを指定するようになっています。 Subversion で使用する URL の詳細は後ほどまた触れるつもりです。
ファイルをチェックアウトする
リポジトリにファイルを登録したら、「チェックアウト」という作業を行います。これはリポジトリに登録されたファイルを指定した場所にコピーし、バージョン管理を始めるコマンドです。ここではホームディレクトリにチェックアウトしましょう。チェックアウトするファイルがすでに存在するとエラーになるので、先立って削除してからチェックアウトします。
rm .bashrc svn checkout file:///home/hokousya/svn/current .
これで "~/.bashrc" が Subversion の管理下に入りました。最初に削除した "~/.bashrc" がチェックアウトで元に戻っているはずです。内容は同じですが、バージョン管理下のファイルとして登録されています。
なお、チェックアウトすると展開先ディレクトリ(ここではホームディレクトリ)に ".svn" という隠しディレクトリが作成されます。この中には Subversion の管理情報が格納されていますので、決して削除したり編集したりしないでください。
ファイルを更新する
次はファイルを更新してみましょう。内容はなんでもいいのですが、例として "~/.bashrc" に以下の行を追加してください。
# New line.
この状態で "svn status" というコマンドを実行すると、以下のように表示されます(この他にも "? xxx" というような行が多数表示されますが、無視してください)。
M .bashrc
これは、".bashrc" が変更されており、その変更がまだリポジトリに登録されていないことを示しています。この変更をリポジトリに登録する(コミットと呼びます)には、以下のようにします。
svn commit -m "Added a new line."
これでカレントディレクトリ以下の Subversion 管理下にあるファイルの変更内容が、リポジトリに反映されます。
ファイルのログを見る
これまでのことは、本当にリポジトリに記録されているのでしょうか。確認のためにログを表示してみましょう。以下のコマンドを実行してください。
svn log .bashrc
すると、以下のように import と commit の操作が記録されています。
------------------------------------------------------------------------ r2 | hokousya | 2006-04-20 13:46:50 +0900 (木, 20 4 2006) | 1 line Added a new line. ------------------------------------------------------------------------ r1 | hokousya | 2006-04-20 13:30:55 +0900 (木, 20 4 2006) | 1 line Import .bashrc ------------------------------------------------------------------------
各ログの最初にある "r1" などがリビジョン番号というもので、リポジトリの内容が変更されるたびにインクリメントされていきます。過去の内容を参照したりする場合は、このリビジョン番号で対象を特定します。
ファイルを追加する
まだリポジトリには "~/.bashrc" しかありません。当然、他のファイルもバージョン管理したいと考えることでしょう。すでにチェックアウトを行ったディレクトリにあるファイルを追加するのは簡単です。例えば "~/.bash_profile" を追加するには、以下のようにします。
svn add .bash_profile
この時点では追加操作がスケジューリングされただけですので、実際にはリポジトリに反映されていません。このほかにも追加したいファイルがあれば同様に "svn add" コマンドを実行し、最後にコミットすることで一気にリポジトリに反映されます。
svn commit -m "Add .bash_profile"
このように複数の操作を一度にコミットするようになっているのは、多人数で同時にひとつのリポジトリを参照しているときに、変更途中の中途半端な状態を他の作業者が拾ってしまうのを防ぐためです。
さて、今度はリポジトリに登録されているファイルのリストを表示させてみましょう。以下のコマンドを実行してください。
svn list file:///home/hokousya/svn/current
このように、"svn list" コマンドを使用すると、指定したリポジトリ内のディレクトリの内容を直接確認できます。先ほど追加したファイルがすべてリストアップされるはずです。
ファイルをロールバックする
バージョン管理の利点のひとつは、簡単に以前の状態を復帰できることです。先ほどの "~/.bashrc" への変更を無効にして、最初の状態に戻してみましょう。いろいろ方法があるのですが、私がよく使うのは以下のようにして逆差分を適用する方法です。
svn merge -r 2:1 .bashrc
これにより、リビジョン 2 から 1 に戻す差分を "~/.bashrc" に適用します。"~/.bashrc" を表示して、最初の状態に戻っているのを確認してみてください。
正常に戻っているようなら、commit してリポジトリに記録します。
svn commit -m "Rolled back to revision 1."
ここで "svn log .bashrc" を実行すると、以下のようにすべての操作が記録されています。リビジョン 3 が抜けていますが、これは "~/.bash_profile" の追加は "~/.bashrc" とは関係ないからです。
------------------------------------------------------------------------ r4 | hokousya | 2006-04-20 14:12:05 +0900 (木, 20 4 2006) | 1 line Rolled back to revision 1. ------------------------------------------------------------------------ r2 | hokousya | 2006-04-20 13:46:50 +0900 (木, 20 4 2006) | 1 line Added a new line. ------------------------------------------------------------------------ r1 | hokousya | 2006-04-20 13:30:55 +0900 (木, 20 4 2006) | 1 line Import .bashrc ------------------------------------------------------------------------
以上、簡単に Subversion を使ってみた様子をご紹介しました。ここでご紹介したのは Subversion の機能のほんの一部です。このほかにも、最低限 update, delete あたりのコマンドは押さえておいたほうがよいでしょう。そのあたりの詳細は Subversion によるバージョン管理を参照してください。
Subversion の URL について
前述のように、 Subversion ではリポジトリ内のファイルを URL で指定します。これはインターネットの URL と似ていますが、別物と考えたほうが良いでしょう。 Subversion の URL の書式は以下のようになっています。
スキーマ://リポジトリの場所/リポジトリ内のパス
- スキーマ
- リポジトリにアクセスするプロトコルを指定します。詳細は後述。
- リポジトリの場所
- リポジトリを格納しているディレクトリのパスです。file スキーマではファイルシステム上の絶対パスに一致しますが、通常はサーバー側で指定された公開ディレクトリからの相対パスになります。
- リポジトリ内のパス
- 操作したいファイル・ディレクトリを指定する、リポジトリ内の仮想的なパスです。実際のリポジトリディレクトリの内容はデータベースになっていますので、ここで指定されたファイルが実在するわけではありません。
例えば、先ほどの "file:///home/hokousya/svn/current" という URL は、リポジトリ "/home/hokousyasvn" 内にある "current" ディレクトリに "file" スキーマでアクセスする、ということを表現しています。
Subversion が標準で扱えるスキーマには以下のものがあります。
スキーマ | アクセス方法 |
---|---|
file | ローカルファイルシステム |
http | WebDAV |
https | SSL 経由の WebDAV |
svn | svnserve サーバーへのアクセス(独自プロトコル) |
svn+ssh | SSH 経由で svnserve を起動 |
"file" 以外のスキーマに関しては、折を見て記事にしようと思います。すぐに知りたいという方は Subversion によるバージョン管理 の第6章 サーバの設定あたりをご参照ください。
ということで、本日は Subversion のインストール方法と簡単な使い方をご紹介しました。今後も機会があれば詳しい使用方法や Tips などを記事にしていこうと思っています。最近は GUI フロントエンドもいくつか開発されているようなので、そちらを試してみるのもいいですね。
バージョン管理システムは使い方を覚えると非常に便利なものです。味を占めると、ついなんでもかんでもバージョン管理しようとしてしまうほど(笑)。まだ使っていない方は、ぜひこの機会に試してみてください!(^^)
詳しくはこちらの記事をどうぞ!
この記事にコメントする