以前指摘したように、リポジトリはタイムマシンのようなところが あります。いままでコミットされたすべての変更を記録し、 ファイルやディレクトリ、それに付随したメタデータの以前のバージョン を見ることによって履歴を調べることができます。一つのSubversion コマンドを使って、過去の任意の日付やリビジョン番号時のリポジトリ の状態をチェックアウト(あるいは既にある作業コピーの復元)すること ができます。しかし、過去に戻る のではなく、 単に過去がどうだったかをちょっと覗いて みたい こともよくあります。
リポジトリからの履歴データをあつかうためのコマンドがいくつか あります:
全般的な情報を表示します: リビジョンに付随した日付、修正者つきの ログメッセージとそれぞれのリビジョンでどのパスが変更されたかを表示します。
時間とともにあるファイルがどのように変更されてきたかを 表示します。
これは特定のリビジョン番号時点でのファイルを抽出し 画面に表示します。
任意の指定したリビジョンのファイルやディレクトリを一覧 表示します。
ファイルやディレクトリの履歴に関する情報を見たいときは 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は既に見てきました— 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 --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 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 update と svn 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 …