检查历史

如前所述,资料库像一个时间机器。它保存所有提交过的修改的纪录,并允许你浏览历史,你可以检查文件和目录的以前的版本 以及伴随它们的元数据。只使用一个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 line

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
…

这样将显示工作文件曾被修改的那些修订版的日志消息。

如果你想得到关于一个文件或目录的更多信息,可以使用svn log--verbose (-v)选项。因为Subversion允许你移动和复制文件,能跟踪文件系统路径的改变很重要,所以在verbose模式下,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 diff

之前我们已经看到svn diff——它用标准化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程序来查看这两个不同修订版中文件的差别(可能是用图形化的程序,或者可能你的文件格式特殊导致 标准化的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/

这些列告诉你文件和目录上次被修改的修订版,谁修改了它,如果是文件会给出大小,上次修改日期,和它的名字。

关于历史的最后一点说明

除了上面所有的命令,你可以使用带--revision选项的svn updatesvn checkout来使整个工作副本“回到过去”。 [5]:

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


[5] 看,我们告诉过你Subversion是一个时间机器。