本文档旨在描述 Apache™ Subversion® 的 1.7.x 系列。如果您运行的是其他版本的 Subversion,强烈建议您访问 https://svnbook.subversion.org.cn/,并查阅适合您 Subversion 版本的文档。
svn log — 显示提交日志消息。
显示来自存储库的日志消息。如果没有提供参数,svn log 将显示工作副本当前工作目录(包括)内所有文件和目录的日志消息。您可以通过指定路径、一个或多个修订版本或两者的组合来细化结果。本地路径的默认修订版本范围为 BASE:1
。
如果您仅指定 URL,它将打印 URL 包含的所有内容的日志消息。如果您在 URL 后添加路径,则只会打印该 URL 下这些路径的日志消息。URL 的默认修订版本范围为 HEAD: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
该项目已被另一个项目替换,但位置相同。
除了在更改路径之前使用的操作代码之外,svn log 结合 --verbose
(-v
) 选项将记录路径是否作为复制操作的结果被添加或替换。它通过在这些路径之后打印 (from
来实现。COPY-FROM-PATH
:COPY-FROM-REV
)
当您将多个对 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 | … ------------------------------------------------------------------------
您可以通过使用 --incremental
选项来避免输出中双虚线的混乱。
$ svn log --incremental -r 14 > mylog $ svn log --incremental -r 19 >> mylog $ svn log --incremental -r 27 >> mylog $ cat mylog ------------------------------------------------------------------------ r14 | … ------------------------------------------------------------------------ r19 | … ------------------------------------------------------------------------ r27 | …
--incremental
选项在使用 --xml
选项时提供类似的输出控制。
$ 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 时看到的输出相结合。只需使用 --diff
选项调用 svn log 即可触发此输出模式。
$ 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
)。