This text is a work in progress—highly subject to change—and may not accurately describe any released version of the Apache™ Subversion® software. Bookmarking or otherwise referring others to this page is probably not such a smart idea. Please visit http://www.svnbook.com/ for stable versions of this book.

名称

svn log — 显示提交日志消息.

大纲

svn log [PATH]

svn log URL[@REV] [PATH...]

描述

显示仓库的日志消息. 如果没有指定目标参数, svn log 将显示当前工作副本目录的日志消息. 为了提炼输出结果, 你可以指定一个路径, 一个或多个版本号, 或路径与版本号的组合. Subversion 为一个本地路径打印的默认版本号范围是 BASE:1.

如果用户只指定了一个 URL, 命令将会为 URL 内的所有文件打印日志 消息, 如果你在 URL 中添加了路径, 命令将只打印该路径的日志消息. Subversion 为一个 URL 打印的默认版本号范围是 BASE:1.

如果添加了选项 --verbose (-v), svn log 还会额外打印在本次修改中受到影响的路径. 如果添加了选项 --quiet (-q), svn log 将不会打印日志消息的文本内容, 这个选项和 选项 --verbose (-v) 是兼容的.

即使在一次提交中受到影响的路径在命令行中出现了多次, 对应的日志 消息也只显示一次. 日志默认会跟随复制历史, 但可以用选项 --stop-on-copy 禁止跟随, 这可以用来判断创建分支的 时间点.

选项

示例

如果直接运行 svn log, 则查看的是当前工作 副本目录中, 所有路径的修改历史:

$ svn log
------------------------------------------------------------------------
r20 | harry | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line

Tweak.
------------------------------------------------------------------------
r17 | sally | 2003-01-16 23:21:19 -0600 (Thu, 16 Jan 2003) | 2 lines
…

查看工作副本中, 某个特定文件的修改历史:

$ svn log foo.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line

Added defines.
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

如果手上没有工作副本, 还可以根据 URL 查询历史:

$ svn log http://svn.red-bean.com/repos/test/foo.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line

Added defines.
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

如果你想查看同一个 URL 下的多个路径, 可以使用 URL [PATH...] 语法:

$ svn log http://svn.red-bean.com/repos/test/ foo.c bar.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line

Added defines.
------------------------------------------------------------------------
r31 | harry | 2003-01-10 12:25:08 -0600 (Fri, 10 Jan 2003) | 1 line

Added new file bar.c
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

如果添加了选项 --verbose (-v), svn log 还会打印在版本号中被修改的路径, 每个路径 都占据单独的一行, 并在行的开头添加能够表示修改类型的操作码.

$ svn log -v http://svn.red-bean.com/repos/test/ foo.c bar.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line
Changed paths:
   M /foo.c

Added defines.
------------------------------------------------------------------------
r31 | harry | 2003-01-10 12:25:08 -0600 (Fri, 10 Jan 2003) | 1 line
Changed paths:
   A /bar.c

Added new file bar.c
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

svn log 只使用了几种操作码, 这些操作码和命令 svn update 使用的操作码非常类似:

A

该项是新增的.

D

该项被删除了.

M

该项的属性或内容被修改了.

R

该项被其他项目替换了.

除了在路径前加上操作码, 添加了选项 --verbose (-v) 的 svn log 还会注释路径 是否是通过复制得到的, 注释的形式是在路径后加上 (from COPY-FROM-PATH:COPY-FROM-REV).

如果你想串联多个 svn log 的执行结果, 那你可能 需要选项 --incremental. svn log 通常会在开始打印日志消息之前, 在打印完一条日志消息之后, 以及打印完最 后一条日志消息之后打印一行连字符. 如果你用 svn log 查询一段版本号范围内的日志, 你将会得到:

$ svn log -r 14:15
------------------------------------------------------------------------
r14 | …

------------------------------------------------------------------------
r15 | …

------------------------------------------------------------------------

然而, 如果你想把多个不连续的日志消息写到一个文件中, 你可能会这 样做:

$ svn log -r 14 > mylog
$ svn log -r 19 >> mylog
$ svn log -r 27 >> mylog
$ cat mylog
------------------------------------------------------------------------
r14 | …

------------------------------------------------------------------------
------------------------------------------------------------------------
r19 | …

------------------------------------------------------------------------
------------------------------------------------------------------------
r27 | …

------------------------------------------------------------------------

为了避免出现凌乱的双条连字符行, 可以为 svn log 加上选项 --incremental:

$ svn log --incremental -r 14 > mylog
$ svn log --incremental -r 19 >> mylog
$ svn log --incremental -r 27 >> mylog
$ cat mylog
------------------------------------------------------------------------
r14 | …

------------------------------------------------------------------------
r19 | …

------------------------------------------------------------------------
r27 | …

如果已经添加了选项 --xml, 再加上选项 --incremental 后能提供类似的输出控制:

$ svn log --xml --incremental -r 1 sandwich.txt
<logentry
   revision="1">
<author>harry</author>
<date>2008-06-03T06:35:53.048870Z</date>
<msg>Initial Import.</msg>
</logentry>
[提示] 提示

有时候, 如果你用 svn log 查询某个路径在 特定版本号上的历史, 你可能看不到任何日志被打印出来, 例如:

$ svn log -r 20 http://svn.red-bean.com/untouched.txt
------------------------------------------------------------------------

这仅仅意味着该路径在该版本号上没有发生任何修改. 为了得到该版本 号的日志消息, 要么把仓库的根目录 URL 作为目标, 要么你很清楚该版本 号修改了哪个路径, 并把它作为目标:

$ svn log -r 20 touched.txt 
------------------------------------------------------------------------
r20 | sally | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line

Made a change.
------------------------------------------------------------------------

从 Subversion 1.7 开始, svn log 支持一种特殊 的输出模式, 该模式和 svn diff 一样能够把修改以 标准差异格式输出, 方法就是为 svn log 加上选项 --diff:

$ svn log -r 20 touched.txt --diff
------------------------------------------------------------------------
r20 | sally | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line

Made a change.

Index: touched.txt
===================================================================
--- touched.txt	(revision 19)
+++ touched.txt	(revision 20)
@@ -1 +1,2 @@
 This is the file 'touched.txt'.
+We add such exciting text to files around here!
------------------------------------------------------------------------
$

svn diff 一样, 用户可以利用选项 --depth, --diff-cmd--extensions (-x) 控制差异比较的 具体行为.

从 Subversion 1.8 开始, 用户可以用选项 --search--search-and 过滤 svn log 的 输出. 如果在命令中用到了这两个选项, 那么仅当版本号的作者, 提交日期, 日志消息内容或被修改的路径和模式匹配时, 日志消息才会被打印出来. 在 匹配被修改的路径时, 还要求加上选项 --verbose, 否则 的话 svn log 不会去匹配被修改的路径.

搜索模式 (也被称作文本表达式或 Shell 通配符模式) 可以包含普通 字符和下面的通配符:

?

匹配任意一个字符.

*

匹配任意一个字符序列.

[ABC]

匹配中括号内的任意一个字符.

如果选项 --search 出现了多次, 那么只要任意一个 模式得到匹配, 日志消息就会被打印, 例如:

$ svn log --search sally --search harry https://svn.red-bean.com/repos/test
------------------------------------------------------------------------
r1701 | sally | 2011-10-12 22:35:30 -0600 (Wed, 12 Oct 2011) | 1 line

Add a reminder.
------------------------------------------------------------------------
r1564 | harry | 2011-10-09 22:35:30 -0600 (Sun, 09 Oct 2011) | 1 line

Merge r1560 to the 1.0.x branch.
------------------------------------------------------------------------
$
        

如果选项 --search--search-and 一起使用, 则只有同时匹配所有模式的 日志消息才会被打印, 例如:

$ svn log --verbose --search sally --search-and /foo/bar https://svn.red-bean.com/repos/test
------------------------------------------------------------------------
r1555 | sally | 2011-07-15 22:33:14 -0600 (Fri, 15 Jul 2011) | 1 line
Changed paths:
M /foo/bar/src.c

Typofix.
------------------------------------------------------------------------
r1530 | sally | 2011-07-13 07:24:11 -0600 (Wed, 13 Jul 2011) | 1 line
Changed paths:
M /foo/bar
M /foo/build

Fix up some svn:ignore properties.
------------------------------------------------------------------------
$
[提示] 提示

选项 --search--search-and 实际上并没有执行搜索, 它们仅仅是过滤 svn log 的 输出. 因此, 如果还使用了选项 --limit, 它将会限制 过滤前的日志消息数量, 而不是限制已过滤的日志消息数量.