履歴の確認

Your Subversion repository is like a time machine. It keeps a record of every change ever committed, and allows you to explore this history by examining previous versions of files and directories as well as the metadata that accompanies them. With a single Subversion command, you can check out the repository (or restore an existing working copy) exactly as it was at any date or revision number in the past. However, sometimes you just want to peer into the past instead of going into the past.

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

svn log

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

svn diff

Shows line-level details of a particular change.

svn cat

Retrieves a file as it existed in a particular revision number and display it on your screen.

svn list

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

変更履歴の一覧生成

ファイルやディレクトリの履歴に関する情報を見たいときは 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
------------------------------------------------------------------------

Note that the log messages are printed in reverse chronological order by default. If you wish to see a different range of revisions in a particular order, or just a single revision, pass the --revision (-r) option:

$ svn log -r 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が)変更されたリビジョン だけを表示します。

If you want even more information about a file or directory, svn log also takes a --verbose (-v) option. Because Subversion allows you to move and copy files and directories, it is important to be able to track path changes in the filesystem, so in verbose mode, svn log will include a list of changed paths in a revision in its output:

$ 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 also takes a --quiet (-q) option, which suppresses the body of the log message. When combined with --verbose, it gives just the names of the changed files.

更新履歴の詳細の確認

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

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

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

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

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

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

As we've seen, invoking svn diff with no options will compare your working files to the cached 「pristine」 copies in the .svn area:

$ svn diff
Index: rules.txt
===================================================================
--- rules.txt        (リビジョン 3)
+++ rules.txt        (作業コピー)
@@ -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 -r 3 rules.txt
Index: rules.txt
===================================================================
--- rules.txt        (リビジョン 3)
+++ rules.txt        (作業コピー)
@@ -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
$

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

If two revision numbers, separated by a colon, are passed via --revision (-r), then the two revisions are directly compared.

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

A more convenient way of comparing a revision to the previous revision is to use the --change (-c):

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

Lastly, you can compare repository revisions even when you don't have a working copy on your local machine, just by including the appropriate URL on the command line:

$ svn diff -c 5 http://svn.example.com/repos/example/trunk/text/rules.txt
…
$

リポジトリの閲覧

Using svn cat and svn list, you can view various revisions of files and directories without changing the working revision of your working copy. In fact, you don't even need a working copy to use either one.

svn cat

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

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

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

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

svn list

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

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

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

$ svn list -v http://svn.collab.net/repos/svn
  20620 harry            1084 Jul 13  2006 README
  23339 harry                 Feb 04 01:40 branches/
  21282 sally                 Aug 27 09:41 developer-resources/
  23198 harry                 Jan 23 17:17 tags/
  23351 sally                 Feb 05 13:26 trunk/

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

警告

The svn list with no arguments defaults to the repository URL of the current working directory, not the local working copy directory. After all, if you wanted a listing of your local directory, you could use just plain ls (or any reasonable non-Unixy equivalent).

過去のリポジトリスナップショットの取得

In addition to all of the above commands, you can use svn update and svn checkout with the --revision option to take an entire working copy 「back in time[8]:

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

ティップ

Many Subversion newcomers attempt to use the above svn update example to 「undo」 committed changes, but this won't work as you can't commit changes that you obtain from backdating a working copy if the changed files have newer revisions. See 削除されたアイテムの復活項 for a description of how to 「undo」 a commit.

Lastly, if you're building a release and wish to bundle up your files from Subversion but don't want those pesky .svn directories in the way, then you can use svn export to create a local copy of all or part of your repository sans .svn directories. As with svn update and svn checkout, you can also pass the --revision option to svn export:

$ svn export http://svn.example.com/svn/repos1 # 最新リビジョンをエクスポート
…
$ svn export http://svn.example.com/svn/repos1 -r 1729
# リビジョン r1729 をエクスポート
…


[8] See? We told you that Subversion was a time machine.