为什么?为什么不只使用一个指向问题跟踪记录,或完全记录修改背景的历史归档邮件列表的链接呢?这是因为Subversion社区中CVS时代的老不死习惯呢,还是有其他好处?
我敢说大多数人不希望在查找期望的信息时切换工具,为什么开发者要启动web浏览器并连接问题跟踪工具,也许这些页面包含几百个注释–有一些是有价值的,而有些仅仅是有人说”Yeah, I want this bug fixed, too”–所有的只是指出了特定功能改变的历史?为什么一个用户需要从版本控制历史中挖掘一个bug是否被修正或者某个特性是否被添加,而且试图从日志信息和分支名称中猜测比较象的发布,这样做能看到希望吗?
他们不应该,你应该看到,两种工具有不同的目的,他们是互相补充,但是有意的读者完全不同。
版本控制系统只关于代码,开发者生活在版本控制中,没有版本控制来编写软件就像…好的,我听说这样非常不好,但是用户经常会意识不到版本控制的存在,他们会非常高兴的从一个发布包到另一个发布包,而不会考虑其保存在版本控制系统中的区别,用户生活在问题跟踪工具中。
一个问题跟踪工具会在很高的级别处理缺陷或特性,用户不会关心在文件srcfile.c中的doit()需要在823行进行修改,来修正调用doit_helper()私有方法的错误处理逻辑。他们只希望知道bug已经消失,是在哪个版本修正。在另一方面,开发者希望知道 — 需要知道 — 所有细节,包括这个修订版本修改的哪些函数或类?这个方法或类在哪些修订版本中修改了?怎样的修改?不幸的是,在问题跟踪工具中保存此类信息不是一个最好的办法。
我和其它几位开发者知道将ChangeLog文件保存在工作拷贝的顶级目录,通过svn log -v(一些项目甚至将ChangeLog文件纳入版本控制,而那是CVS的回归)的输出生成。我们为什么要有这些问题建?因为我经常要回答类似的问题,”哪些修订版本srcfile.c有更改?为什么?哪些修订版本动了doit()?一样的,为什么?“如果我需要同时使用版本控制和问题追踪工具收集这些问题–特别是如果追踪工具不支持命令行方式的访问–同时包含可读–和机器可解析的输出–我和许多开发者会变成瘸子。
然而,因为ChangeLog确实有用,我可以查找方法名或类标注的修改。不幸的是,大多数版本控制工具不会理解它们存放文件的内容,你可以通过diff工具察看文本文件之间每一行的差别,但是版本控制工具本身不会知道函数之间的区别。那就是为什么需要记录工具会报告给你的细节水平的信息,例如在修订日志信息。很自然,如果日志信息有此种程度的细节,你希望可视化的安排它,这样修改可以根据路径分组,而且通过结合你的格式,你的脚本可以被解析和报告。所以普遍的开发者需求和广泛实践的活动驱使Subversion社区领导要求格式良好的日志信息,就像项目过程文档中描述的那种。
当然,也有些遗留的原因,比如一些日志信息的细节习惯。一些人通过一些特定的文本格式来定位问题跟踪工具或贡献者信息,这样做为辅助记器解析,跨工具集成和报告带来了很大的方便。Subversion对于自定义修订版本属性的支持鼓励我们使用自定义属性(例如myproject:issue-ids或myproject:contributors
)来保存这些信息,这将会大大简化对这类数据提交后的处理,我相信TortoiseSVN实际上已经利用这些特性。我想有两件事情会让这些事情成为日常的惯例,首先Subversion会允许我们在提交时设置任意的修订版本属性(幸运的是,Subversion1.5将会发生。我是怎么知道的?一个合适的工具告诉的我)。第二,Subversion需要支持更好的客户端交互,用来查找这些属性。
下面是我偶尔生成变更日志文件的脚本,它能知道当前工作目录所在Subversion版本库URL的基础名,如果你有一个trunk的工作拷贝,它会生成包含trunk和所有branches日志信息的变更日志文件,否则它会产生你所在版本化目录的日志数据。它只会在你的版本库遵循使用根路径包含trunk、tags和branches的最佳实践时才有效,但是我工作的项目都是遵循这种习惯。显然,这个脚本没有什么魔力,我可以仅仅使用svn log就可以得到一些信息,但是我经常会在没有网络连接的时候工作,所以对我来说有修订版本日志信息的缓存会很方便,不管怎么样,这是脚本:
#!/bin/sh
if [ ! -d ".svn" ] ; then
echo "ERROR: Not in a Subversion working copy" 1>&2
exit 1
fi
LOGFILE=./ChangeLog
TRUNK=`svn info | grep "URL" | tail -c 6`
if [ ${TRUNK} = "trunk" ] ; then
URL=`svn info | grep "Repository Root" | cut -c18-`
echo "Generating ChangeLog for ${URL} (trunk, branches)"
svn log -v ${URL} trunk branches > ${LOGFILE}
else
URL=`svn info | grep "URL" | cut -c6-`
echo "Generating ChangeLog for ${URL}"
svn log -v .@HEAD > ${LOGFILE}
fi
C. Michael (Mike) Pilato has been on the Subversion project as a committer since 2000. Mike is one of the co-authors of “Version Control with Subversion” and he is on the board of the non-profit Subversion Corporation.