【发布时间】:2010-04-09 11:02:04
【问题描述】:
每当我们发布项目时,我们都会创建一个标签来捕获快照。能够查看在某些版本中使用了主干历史记录中的哪些修订版将非常有帮助。我知道 TortoiseSVN 修订图显示了此信息,但我想知道是否有办法在命令行 svn 日志中查看它?
我来自 Clearcase 背景,我们将能够在历史记录中看到发布标签。
【问题讨论】:
每当我们发布项目时,我们都会创建一个标签来捕获快照。能够查看在某些版本中使用了主干历史记录中的哪些修订版将非常有帮助。我知道 TortoiseSVN 修订图显示了此信息,但我想知道是否有办法在命令行 svn 日志中查看它?
我来自 Clearcase 背景,我们将能够在历史记录中看到发布标签。
【问题讨论】:
tags 目录的日志应该包括它在创建标签时提交的修订,那么您的trunk 的修订号会小于那个。
还是我误会了什么?
看看我的类库:WebSVN view for my class library tags' directory
您可以看到每个构建最终的修订版,因为它是同一个存储库,因此标记的修订号比主干中已标记更改的最大可能修订版高 1。
使用简单的svn log 命令如下所示:
[C:\Temp] :svn log http://svn.vkarlsen.no/svn/LVK/LVK_3_5/tags
-----------------------------------------------------------------------
r751 | lassevk | 2009-10-04 13:45:07 +0200 (sø, 04 okt 2009) | 1 line
Build 750
-----------------------------------------------------------------------
r636 | lassevk | 2009-07-31 07:00:11 +0200 (fr, 31 jul 2009) | 1 line
Build 635
-----------------------------------------------------------------------
r632 | lassevk | 2009-07-25 06:19:27 +0200 (lø, 25 jul 2009) | 1 line
Build 631
-----------------------------------------------------------------------
r614 | lassevk | 2009-07-23 06:18:58 +0200 (to, 23 jul 2009) | 1 line
Build 612
|----|
^
+-- this column here shows the tag commit revision, trunk is less than that
或者用xml:
[C:\Temp] :svn log http://svn.vkarlsen.no:81/svn/LVK/LVK_3_5/tags --xml
<?xml version="1.0"?>
<log>
<logentry
revision="751"> <-- this
<author>lassevk</author>
<date>2009-10-04T11:45:07.445750Z</date>
<msg>Build 750</msg>
</logentry>
<logentry
revision="636"> <-- and this
<author>lassevk</author>
<date>2009-07-31T05:00:11.796875Z</date>
<msg>Build 635</msg>
</logentry>
这是一个 python 脚本,它会输出一些东西,它的格式不是很好,因为它不能正确处理修订版 cmets 中的换行符,但它应该能让你继续前进。
from xml.dom.minidom import parse;
# files created by:
# svn log http://svn.vkarlsen.no:81/svn/LVK/LVK_3_5/tags --xml >tags.xml
# svn log http://svn.vkarlsen.no:81/svn/LVK/LVK_3_5/trunk --xml >trunk.xml
def get_revs(filename):
log = parse(filename);
try:
for rev in log.getElementsByTagName("logentry"):
revision = int(rev.getAttribute("revision"));
rev.getElementsByTagName("msg")[0].normalize();
comment = rev.getElementsByTagName("msg")[0].firstChild.nodeValue.rstrip();
yield (revision, comment);
finally:
log.unlink();
tag_revs = [tr for tr in get_revs("tags.xml")];
trunk_revs = [tr for tr in get_revs("trunk.xml")];
tag_revs.insert(0, (max((tr[0] for tr in trunk_revs)), "HEAD"));
tag_rev_lookup = {};
for tag_rev in tag_revs:
tag_rev_lookup[tag_rev[0]] = tag_rev[1];
prev_tag = -1;
for trunk_rev in trunk_revs:
tag_rev_for_trunk_rev = min((tr[0] for tr in tag_revs if tr[0] >= trunk_rev[0]));
if tag_rev_for_trunk_rev != prev_tag:
print("tag #%d: %s" % (tag_rev_for_trunk_rev, tag_rev_lookup[tag_rev_for_trunk_rev]));
prev_tag = tag_rev_for_trunk_rev;
print(" rev #%d: %s" % trunk_rev);
这会输出这个(截断):
tag #879: HEAD
rev #879: Fixed build properties and added FinalBuilder project. Need PostSharp 2 to work properly for x64.
rev #878: Adjusted property targets.
Fixed references to SQLite for 32 and 64-bit.
rev #877: Removed 32-bit only SQLite library.
rev #876: Removed 32-bit only SQLite library.
rev #875: Removed 32-bit only SQLite library.
rev #874: Cleaned up dependencies on SQLite.
rev #873: Removed SQLite connection editor from UI.Windows project.
rev #872: Added separate projects for SQLite functionality.
rev #870: Changes to allow code to compile without resource files.
rev #859: Added Any CPU target.
我添加了一个名为 HEAD 的人工标签以确保所有日志条目都存在,但您可以轻松删除它并忽略它。
代码在这里:WebSVN repository for above example code。
我将其更改为输出 xml,格式与原始 svn log --xml 的格式有些相同,存储库中的代码有这些更改,输出现在看起来像:
<?xml version="1.0" ?>
<tags>
...
<tag revision="8"> --+
<logentry revision="8"> --+ |
<author> | |
lassevk | |
</author> | |
<date> | |
2007-12-08T20:36:18.730377Z +-- from tags.xml |
</date> | |
<msg> | |
Created folder remotely | |
</msg> | |
</logentry> --+ |
<revisions> +-- repeated
<logentry revision="7"> --+ | for each
<author> | | tag
lassevk | |
</author> | |
<date> | |
2007-12-08T20:36:14.324041Z +-- from trunk.xml |
</date> | repeated for each |
<msg> | revision |
Created folder remotely | |
</msg> | |
</logentry> --+ |
</revisions> |
</tag> --+
</tags>
每个<tag...> 节点都有一个<logentry...> 子节点,它是来自标签xml 日志的标签日志条目,然后是一个节点<revisions>,其中所有子节点都是来自主干xml 日志的相关日志条目。
【讨论】: