リビジョン: 番号、キーワード、そして、時刻、おやおや・・・

話を進める前に、リポジトリ中の特定のリビジョンを特定する方法について少し 知っておく必要があります。 リビジョン項 で 見たように、リビジョンは、リポジトリのある特定の時点における 「スナップショット」です。 コミットを繰り返してリポジトリが大きくなるにつれ、スナップショットを特定する 仕組みが必要になってきます。

リビジョンの特定には、 --revision (-r) スイッチの あとにほしいリビジョン番号を続けます。 (svn --revision REV) とするか、 二つのリビジョンをコロンで区切って範囲指定することもできます (svn --revision REV1:REV2). また、リビジョンは、番号、キーワード、日付で参照することもできます。

リビジョン番号

新しいSubversionのリポジトリを作ると、最初はリビジョンゼロとなり、その後の コミットのたびにリビジョン番号は一つずつ大きくなります。 コミットが完了した後では、Subversionクライアントはあなたに一番新しい リビジョン番号を知らせます:

$ svn commit --message "Corrected number of cheese slices."
Sending        sandwich.txt
Transmitting file data .
Committed revision 3.

その後、いつでもこのリビジョンを参照したければ、 (この章の後のほうで、どうしてそんなことが必要かを説明します。) 「3」として参照することができます。

リビジョンキーワード

Subversionクライアントはさまざまな リビジョンキーワードを理解できます。 このようなキーワードは --revisionスイッチの整数引数のかわりに 使うことができ、Subversionによって、特定のリビジョン番号に変換されます。:

注意

作業コピーのすべてのディレクトリには.svn と呼ばれる管理用のサブディレクトリがあります。Subversionはディレクトリ 中のそれぞれのファイルごとの コピーをこの管理領域中に保存しています。このコピーは修正されることは なく(キーワード展開は起こりませんし、行末変換もしませんし、その他 いっさい何もしません)、最後のリビジョン(これを「BASE」リビジョン といいます)に存在しているファイルで、作業コピーを更新したときのファイルその もののコピーです。このファイルのことを、 プリスティン・コピーあるいはファイルの テキスト-ベースバージョンと言い、 リポジトリに存在している元のファイルの厳密なコピーです。

HEAD

リポジトリにある最新のリビジョンです。

BASE

作業コピーにあるファイル、ディレクトリの、「修正元」リビジョン です。

COMMITTED

ファイル、ディレクトリが変更されたBASE以前の(または BASEリビジョンを含む)最後のリビジョンです。

PREV

変更があった最後のリビジョンの 直前 のリビジョンです。 (COMITTED - 1 番ということになります)。

注意

PREV, BASE, そして COMMITTED はローカルパス名として参照する のに利用できますが、URL では利用できません。

コマンド実行時のリビジョンキーワードの例です。 コマンドの意味はわからなくても大丈夫です。章を進めるごとに 説明します:

$ svn diff --revision PREV:COMITTED foo.c
# foo.c にコミットした最後の変更を表示

$ svn log --revision HEAD
# 最後のリポジトリへのコミットで付けたログメッセージを表示

$ svn diff --revision HEAD
# 作業コピー内ファイルを、リポジトリの最新バージョンと比較

$ svn diff --revision BASE:HEAD foo.c
# 作業コピーの「修正元」 foo.c を
# リポジトリの最新バージョンと比較

$ svn log --revision BASE:HEAD
# 最後に更新した後のすべてのコミットログを表示

$ svn update --revision PREV foo.c
# foo.c の最後の変更をもとに戻す
# (foo.c の作業リビジョン番号は減少する)

これらのキーワードを使って特定のリビジョン番号や作業コピーの正確な リビジョンを憶えておくことなしに、いろいろな(役に立つ)処理を することができます。

リビジョン日付

リビジョン番号やリビジョンキーワードを指定できるところではどこでも、 中かっこ、「{}」 の中に日付を入れて指定することもできます。 日付とリビジョン番号の両方を使ってリポジトリ中の変更範囲にアクセスする ことさえできます。

ここでは Subversion が受け入れることのできる日付形式の例をあげておきます。 空白を含むような日付は常に引用符でくくるのを忘れないでください。

$ svn checkout --revision {2002-02-17}
$ svn checkout --revision {15:30}
$ svn checkout --revision {15:30:00.200000}
$ svn checkout --revision {"2002-02-17 15:30"}
$ svn checkout --revision {"2002-02-17 15:30 +0230"}
$ svn checkout --revision {2002-02-17T15:30}
$ svn checkout --revision {2002-02-17T15:30Z}
$ svn checkout --revision {2002-02-17T15:30-04:00}
$ svn checkout --revision {20020217T1530}
$ svn checkout --revision {20020217T1530Z}
$ svn checkout --revision {20020217T1530-0500}
…

リビジョンとして日付を指定するときはSubversionはその日付に 一番近いリビジョンを見つけようとします:

$ svn log --revision {2002-11-28}
------------------------------------------------------------------------
r12 | ira | 2002-11-27 12:31:51 -0600 (Wed, 27 Nov 2002) | 6 lines
…

日付範囲を使うこともできます。 Subversionは両方の日付の間にあるすべてのリビジョンを検索対象と します。両端の日付は検索に含みます:

$ svn log --revision {2002-11-20}:{2002-11-29}
…

既に指摘したように、日付とリビジョン番号を混在させることもできます:

$ svn log --revision {2002-11-20}:4040

Subversion で日付を扱う場合、面倒なことが起こるかも知れないことに注意 してください。リビジョンのタイムスタンプはリビジョン属性として保存 されます—つまりバージョン化されていない、修正可能な属性と して、ということです—リビジョンのタイムスタンプは本当の時間 を完全に偽造する形で変更可能ですし、削除してしまうことすら可能です。 このようなことは Subversion が処理する内部的な日付-リビジョン変換 に大混乱を与えるかも知れません。