Subversion+svkでらくらく分散リポジトリ

第1回 Subversionを使おう

この記事を読むのに必要な時間:およそ 6 分

Subversionの基本操作

既に述べたように,SubversionはCVSの後継としてCVSの欠点を補うために開発されました。そのため,Subversionのコマンドの多くはCVSのコマンドと似ています。ここでは,日常的に筆者がよく使う機能を中心に基本的な操作を説明します。詳細は,SubversionのマニュアルSubversionによるバージョン管理を参照してください。

チェックアウト

プロジェクトを開始するとまず,Subversionのリポジトリからローカルの作業ディレクトリにリポジトリをコピー(チェックアウト)します。ここではtestと言う名前でチェックアウトします。

$ svn checkout svn://localhost/ test

プロジェクトのディレクトリ構成

これでリポジトリ全体がチェックアウトできました。次に,基本となるディレクトリを作成します。CVSと違いSubversionでは,ブランチやタグはシステムとしては存在しません。ディレクトリの運用ルールとして,タグやブランチを区別する必要があります。この点はCVSと大きく異なるところで,CVSユーザの多くが混乱します。慣例的に次のようなディレクトリ構成にすることが多いです。

 + Subversionルートディレクトリ
   +- trunk
   +- branches
      +- 各ブランチのディレクトリ
   +- tags
      +- 各ブランチのディレクトリ

チェックアウトしたディレクトリに移動して作業コピーにtrunk,branches,tagsディレクトリを作成します。

$ mkdir trunk
$ mkdir branches
$ mkdir tags

コミット

次にディレクトリを作成したら,作成したディレクトリをサーバにコミットします。まずは,追加したディレクトリをSubversionに追加予告します。

$ svn add trunk branches tags

次に実際にサーバに反映(コミット)します。

$ svn commit -m "start project"

「-m "start project"」はログメッセージになります。このオプションを指定しないと,デフォルトのエディタが立ち上がり,ログの入力を促されます。CVSと違い,Subversionにはログインコマンドがありません。コミットするときなど認証が必要になると,コマンド実行時にユーザIDとパスワードの入力を促されます。一度入力すると,以降はそのユーザIDとパスワードを使って自動的に認証します。

プロジェクトが開始され,ファイルを追加する場合も,同様の操作になります。trunkにreadme.txtを追加してみます。

$ cd trunk
$ echo "Read me first" > readme.txt
$ svn add readme.txt
$ svn commit readme.txt

commitコマンドに明示的にファイル名,ディレクトリ名を指定すると,そのファイル,ディレクトリだけがコミットされます。また,複数のファイル,ディレクトリを指定すれば,一度に複数のファイル,ディレクトリをコミットします。複数のファイル,ディレクトリをまとめてコミットすると,それらを一つのセットとしてリビジョンが割り振られます。

$ echo "GPL" > LICENSE
$ svn add LICENSE
$ svn commit readme.txt LICENSE

削除

ファイルやディレクトリを間違ってコミットしたリ,使用しなくなったファイルやディレクトリなどを削除した場合,deleteコマンドを実行します。例えばtrunkにobsolete.txtがあり,そのファイルを削除する場合は,次のように実行します。

$ cd trunk
$ svn delete obsolete.txt
$ svn commit

deleteを行なうと,そのディレクトリに対して変更が加えられたことになり,最後にそのディレクトリをcommitする必要があります。

更新と競合の解消

チームで開発していると,他の人もリポジトリに対してコミットします。自分の作業ディレクトリを最新にするために,updateコマンドを実行します。

$ svn update

updateを実行すると,時々作業リポジトリの内容を最新のリビジョンに更新できないケースがあります。つまり,コンフリクト(衝突)が起きたケースです。衝突が起きると,⁠ファイル名.mine⁠⁠,⁠ファイル名.rOLDREV⁠⁠,⁠ファイル名.rNEWREV」と言うファイルができます。readme.txtに衝突が起きると,readme.txt,readme.txt.mine,readme.txt.r2, readme.txt.r3というファイルができます。

この場合,手動でコンフリクトを解消する必要があります。コンフリクトを解消するには,下記の方法のいずれかを行ないます。

  • 手動でコンフリクトがおきたファイルをマージ
  • 作業ファイルを「ファイル名.mine⁠⁠,⁠ファイル名.rOLDREV⁠⁠,⁠ファイル名.rNEWREV」のいずれかで上書き
  • ローカルの変更を捨てて最新のリビジョンのファイルを使用

手動でマージする場合,作業ファイルには次のようにマーカがセットされています。

::

 Read me first.
 <<<<<<< .mine
 これは,私の変更点です。
 =======
 これは,サーバの変更点です。
 >>>>>>> .r3
 ここは変更されていません。

「<<<<<<< .mine」から「=======」までが自分の作業ファイルの内容です。⁠=======」から「>>>>>>> .r2」までがサーバ上のファイルの内容です。エディタでそれぞれの内容を確認しながらマージします。

作業ファイルに上書きする場合は,単純に「copy ファイル名.mine ファイル名」とします。

マージした場合も作業ファイルに上書きした場合も修正後に

$ svn resolved readme.txt

として,コンフリクトを解消します。

ローカルの変更を捨てる場合は,次のコマンドを実行します。

$ svn revert readme.txt

revertを実行する場合は,resolveコマンドを実行する必要はありません。以上でコンフリクトの処置は終わりです。

ログの閲覧

コミットしたときのログを取得する場合は,次のコマンドを実行します。

$ svn log readme.txt

ファイル名を指定しない場合は,現在のディレクトリのファイル全体のログが出力されます。リビジョンを指定してログを出力する場合は,⁠-r リビジョン番号」オプションを指定します。

$ svn log -r 2 readme.txt

差分表示

リビジョン間でファイルの変更点を知るためにdiffコマンドを使います。作業コピーの変更点を確認する場合は,

$ svn diff readme.txt

とします。古いリビジョンとの差分を確認する場合は,logコマンドと同様に「-r リビジョン番号」オプションを指定します。

$ svn diff -r 2 readme.txt

また,リビジョン間の差分を確認する場合は,⁠-r」の引数と してリビジョン番号を二つ,コロンで区切って指定します。

$ svn diff -r 2:3 readme.txt

コピーとタグ・ブランチの作成

最後に,ブランチやタグを作成するときには,ディレクトリをコピーします。Subversionのコピーは,サーバ上ではUnixのハードリンクのようにリンク情報だけを持っています。そのため,ディレクトリをコピーしても,サーバ上ではほとんどディスクを消費しません。trunkの最新リビジョンに対してタグを作成する場合は次のようになります。

$ svn copy svn://localhost/trunk svn://localhost/tags/release-1.0

svn://localhost/trunkはSubversionの開発用の最新リビジョンで,コピー元のディレクトリです。このディレクトリをsvn://localhost/branches/release-1.0にコピーしています。

著者プロフィール

大谷弘喜(おおたにひろき)

アリエルネットワーク株式会社所属。P2PアプリケーションやWebアプリケーションの設計,開発。Python大好き。