履歴の確認

以前指摘したように、リポジトリはタイムマシンのようなところが あります。いままでコミットされたすべての変更を記録し、 ファイルやディレクトリ、それに付随したメタデータの以前のバージョン を見ることによって履歴を調べることができます。一つのSubversion コマンドを使って、過去の任意の日付やリビジョン番号時のリポジトリ の状態をチェックアウト(あるいは既にある作業コピーの復元)すること ができます。しかし、過去に戻る のではなく、 単に過去がどうだったかをちょっと覗いて みたい こともよくあります。

リポジトリからの履歴データをあつかうためのコマンドがいくつか あります:

svn log

全般的な情報を表示します: リビジョンに付随した日付、修正者つきの ログメッセージとそれぞれのリビジョンでどのパスが変更されたかを表示します。

svn diff

時間とともにあるファイルがどのように変更されてきたかを 表示します。

svn cat

これは特定のリビジョン番号時点でのファイルを抽出し 画面に表示します。

svn list

任意の指定したリビジョンのファイルやディレクトリを一覧 表示します。

svn log

ファイルやディレクトリの履歴に関する情報を見たいときは svn logコマンドを使ってください。 svn log は、あるファイルやディレクトリを 誰が変更したかの記録を表示し、どのリビジョンでそれが変更され たか、そのリビジョンの時刻と日付、さらにもし存在すれば、 コミットに付随したログメッセージを表示します。

$ svn log
------------------------------------------------------------------------
r3 | sally | Mon, 15 Jul 2002 18:03:46 -0500 | 1 line

Added include lines and corrected # of cheese slices.
------------------------------------------------------------------------
r2 | harry | Mon, 15 Jul 2002 17:47:57 -0500 | 1 line

Added main() methods.
------------------------------------------------------------------------
r1 | sally | Mon, 15 Jul 2002 17:40:08 -0500 | 1 lines

Initial import
------------------------------------------------------------------------

ログメッセージはデフォルトでは 時間と逆の順序で 表示されることに注意して ください。別の順序であるリビジョン範囲を見たい場合や、一つの リビジョンを見たいときには、--revision (-r)スイッチを渡します:

$ svn log --revision 5:19    # shows logs 5 through 19 in chronological order

$ svn log -r 19:5            # shows logs 5 through 19 in reverse order

$ svn log -r 8               # shows log for revision 8

一つのファイルやディレクトリのログ履歴を見ることもできます。 たとえば:

$ svn log foo.c
…
$ svn log http://foo.com/svn/trunk/code/foo.c
…

これは作業ファイルが(またはURLが)変更されたリビジョン だけを表示します。

もしファイルやディレクトリについてもっと詳細な 情報がほしいときには、svn log--verbose (-v) スイッチを とることもできます。Subversionはファイルやディレクトリの 移動やコピーもできるので、ファイルシステム中のパスの 変化を追えることは重要です。冗長モードでは、 svn log は出力リビジョンの中に 変更されたパス情報の一覧も含めます:

$ svn log -r 8 -v
------------------------------------------------------------------------
r8 | sally | 2002-07-14 08:15:29 -0500 | 1 line
Changed paths:
M /trunk/code/foo.c
M /trunk/code/bar.h
A /trunk/code/doc/README

Frozzled the sub-space winch.

------------------------------------------------------------------------

svn log--quiet (-q) スイッチも指定でき、これはログメッセージの本文を 表示しません。--verboseと組み合わせて指定すると 変更したファイルの名前だけを表示します。

svn diff

svn diffは既に見てきました— unified diff形式でファイルの差分を表示するのでした。 リポジトリにコミットする前に作業コピーにされたローカル 修正点を表示するのに使えます。

実際にはsvn diffには異なる 三種類 の使い方があります:

  • ローカルの変更内容の確認

  • 作業コピーとリポジトリの比較

  • リポジトリとリポジトリの比較

ローカルの変更内容の確認

見てきたように、スイッチなしでsvn diff を 実行すると、作業コピーの内容と、.svn 領域にキャッシュされている「修正元リビジョン」 のコピー とを比較します:

$ svn diff
Index: rules.txt
===================================================================
--- rules.txt	(revision 3)
+++ rules.txt	(working copy)
@@ -1,4 +1,5 @@
 Be kind to others
 Freedom = Responsibility
 Everything in moderation
-Chew with your mouth open
+Chew with your mouth closed
+Listen when others are speaking
$

作業コピーとリポジトリの比較

--revision(-r) を一つ 指定すると、作業コピーはリポジトリの特定のリビジョンと比較 されます。

$ svn diff --revision 3 rules.txt 
Index: rules.txt
===================================================================
--- rules.txt	(revision 3)
+++ rules.txt	(working copy)
@@ -1,4 +1,5 @@
 Be kind to others
 Freedom = Responsibility
 Everything in moderation
-Chew with your mouth open
+Chew with your mouth closed
+Listen when others are speaking
$

リポジトリとリポジトリの比較

--revision(-r)の引数と してリビジョン番号を二つ、コロンで区切って指定すると 二つのリビジョンが直接比較されます。

$ svn diff --revision 2:3 rules.txt 
Index: rules.txt
===================================================================
--- rules.txt	(revision 2)
+++ rules.txt	(revision 3)
@@ -1,4 +1,4 @@
 Be kind to others
-Freedom = Chocolate Ice Cream
+Freedom = Responsibility
 Everything in moderation
 Chew with your mouth open 
$

作業コピーとリポジトリのファイルを比較するためにだけ svn diff を利用できるのではなく、URL引数を与えることで作業コピー を用意しなくてもリポジトリ中のアイテムの間の差を調べることができます。 これは、ローカルマシンに作業コピーがないときに、ファイルの変更点を 知りたいような場合に非常に便利です:

$ svn diff --revision 4:5 http://svn.red-bean.com/repos/example/trunk/text/rules.txt
…
$

svn cat

もし、以前のバージョンのファイルを見たいが、二つのファイル間の違い を見る必要はないような場合には、 svn catが使えます:

$ svn cat --revision 2 rules.txt 
Be kind to others
Freedom = Chocolate Ice Cream
Everything in moderation
Chew with your mouth open
$

直接ファイルに出力することもできます:

$ svn cat --revision 2 rules.txt > rules.txt.v2
$

もしかすると、どうして古いリビジョンに戻すためのファイルの更新に 単にsvn update --revisionを使わないのか、と 思うかも知れません。 svn catを使ったほうが 良い理由がいくつかあります。

まず、外部のdiff(多分、GUIかも知れないし、unified diff 形式の出力が 意味を持たないようなファイルなのかも知れません) プログラムによって二つのリビジョンのファイル間の差分を見たいかも知れません。 この場合、古いバージョンのコピーを取得する必要があり、その内容をファイル に出力したものと、作業コピー中のファイルの両方を外部diffプログラムに 渡さなくてはなりません。

しばしば、他のリビジョンとの間の差分をとるよりも、その古いバージョン のファイル全体を見るほうが簡単なことがあります。

svn list

svn list コマンドはローカルマシンに 実際にファイルをダウンロードすることなしに、リポジトリ にどんなディレクトリがあるかを表示します:

$ svn list http://svn.collab.net/repos/svn
README
branches/
clients/
tags/
trunk/

もっと詳しい表示がほしいときには --verbose (-v) フラグを 指定します。出力は以下のようになります:

$ svn list --verbose http://svn.collab.net/repos/svn
  2755 harry          1331 Jul 28 02:07 README
  2773 sally               Jul 29 15:07 branches/
  2769 sally               Jul 29 12:07 clients/
  2698 harry               Jul 24 18:07 tags/
  2785 sally               Jul 29 19:07 trunk/

それぞれの項目の意味は、左から順に、ファイルまたはディレクトリが最後に 更新されたリビジョン、修正した人、ファイルであればそのサイズ、日付、そして そのアイテムの名前になります。

履歴機能について、最後に

いままで述べてきたすべてのコマンドに加えて svn updatesvn checkout を、--revision 付きで実行することも できます。これは作業コピー全体を「過去のある時点」 に戻します。 [7]:

$ svn checkout --revision 1729 # Checks out a new working copy at r1729
…
$ svn update --revision 1729 # Updates an existing working copy to r1729
…


[7] おわかりでしょうか? これが Subversionが タイムマシンだと言った意味です。