这份文档是用来描述 Subversion 1.1 的。如果您正在运行更新版本的 Subversion,我们强烈建议您访问 https://svnbooks.subversion.org.cn/ 并查阅适合您 Subversion 版本的版本。
正如我们之前提到的,仓库就像一台时光机。它记录了所有提交的更改,并允许您通过检查文件的先前版本和目录以及伴随它们的元数据来探索此历史记录。只需一个 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 …
这些将 只显示工作文件(或 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 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/
这些列告诉您文件或目录最后修改的修订版、修改它的人、如果是文件的大小、最后修改的日期以及项目的名称。
除了上述所有命令之外,您还可以使用 svn update 和 svn checkout 以及--revision开关将整个工作副本“带回到过去” [6]
$ svn checkout --revision 1729 # Checks out a new working copy at r1729 … $ svn update --revision 1729 # Updates an existing working copy to r1729 …