如前所述,资料库像一个时间机器。它保存所有提交过的修改的纪录,并允许你浏览历史,你可以检查文件和目录的以前的版本 以及伴随它们的元数据。只使用一个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 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——它用标准化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程序来查看这两个不同修订版中文件的差别(可能是用图形化的程序,或者可能你的文件格式特殊导致 标准化的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/
这些列告诉你文件和目录上次被修改的修订版,谁修改了它,如果是文件会给出大小,上次修改日期,和它的名字。
除了上面所有的命令,你可以使用带--revision选项的svn update和svn
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 …