2009-01-21 226 views
6

我们正在转向SVN。什么样的报告可用于svn?

不幸的是,我们会定期审核,在审核员需要类似的信息:文件的更改
历史访问SVN的
新文件
史加
变化的文件

有一个可以为我们(或其中一些)生成这些报告的工具?

+0

您使用的是什么问题跟踪器?通常情况下,问题跟踪器会提供一些回购报告。 – Joshua 2009-01-21 19:16:49

+0

我们使用定制的问题跟踪器,它与任何东西都不兼容。 – Bravax 2009-01-21 19:53:26

回答

6

StatSVN是一个轻量级的颠覆报告生成器。 http://www.statsvn.org/

  1. 首先生成详细日志文件 - svn log

  2. 运行StatSVN,它是一个JAR文件。

StatSVN提供的度量列表:

  • 该文件被改变的最
  • 多少行添加
  • 谁是贡献更多
2

svn log是基本的命令,让您正在查找的文件相关的信息......

2

你可以拥有所有这些信息只是通过SVN版本日志。你可能想要考虑一个像Fisheye这样的好工具来为你做。

0

看看codesaga。它可视化源代码控制提交很好。我无法担保报告部分。

0

这个程序可以帮助你,不是审计,而是更新

http://www.svnmonitor.com/default.shtml

  • 监视特定事件源
  • 收到任何形式的通知(气囊弹出,托盘图标,电子邮件,声音...)当某些事件发生时
4

Trac(http://trac.edgewall.com)可用于查看SVN详细信息。 Trac具有很好的功能,如变更集视图,可以查看不同的变更集(并通过它们来回移动)。这也提出了一个很好的用户界面,比ViewVC好得多(www.viewvc.org)

+0

此外,它也是一个问题跟踪器和项目管理系统(将任务分配给里程碑,构建路线图等)。 – stpe 2009-01-21 21:08:29

2

SVN提供了很多的你在命令行中所求的权利:

  • 变化的历史到特定文件/目录:svn log /your/path为您提供源代码差异,作者,入住日期等
  • 添加新文件:svnlook changed -r <rev> <path to repository>为您提供在给定修订中被触及的所有文件。循环所有相关的修订版本,而grep表示添加文件的“A”。
  • 变化的文件:svn diff -r <first rev>:<last rev> <path>让你对修订的整个跨度差异
  • 历史访问SVN的:SVN显然可以保存所有的入住手续(见svn log)。至于读取权限,我不知道内建机制,但是您可以根据配置轻松地创建自己的机制。如果您只允许http访问,则可以使用Web服务器的日志文件。

这并不漂亮,但SVN的输出结构非常高,因此您可以轻松地进行自己的格式设置。

0

要查看对SVN的实际访问,您需要解析Apache服务器日志(假设您通过Apache为SVN提供服务)。

1

以下是我之前用过的一些内容,可以帮助您了解变更活动报告和趋势。过滤是不完美的,但你可以得到的想法:

set REPO_URL=svn://localhost/... 
set REVISION_START=1 
set REVISION_END=HEAD 
set COMMAND=svn log %REPO_URL% -v -g -r %REVISION_START%:%REVISION_END% 
set REG_EXPRESSION="^...[ACDIMRX].\/" 

受影响的配置项:

%COMMAND% | find /c "/" 

变更:已影响了独特的文件

%COMMAND% | find /c "Changed paths" 

名单给定的修订范围(我已经安装了cygwin):

%COMMAND% | findstr /r %REG_EXPRESSION% | sort | uniq -u 
0

这个问题也有点老,但我已经制作了一个脚本,可能对Subversion的简单报告/审计有用d跟踪对SVN存储库所做的更改,并且我想分享它。它以类似于命令“svnlook”的方式提取关于SVN提交的信息,但它具有一对优点。首先,它允许遍历存储库的所有修订版,以跟踪所做的所有更改。其次, 信息以制表符分隔的格式打印(如在ps或df等Unix命令中),它们都是人类可读的,并且易于解析或导入到电子表格中,这非常适合报告。它也可以被称为嵌入在SVN后提交钩子或 。

这是一个名为svn-commit-info.pl的Perl脚本,它有三个参数。第一个是存储库路径 ,它是强制性的。第二个是可选的,是要搜索的文件模式。第三个也是可选的,是要查询的修订版号码 。

如果仅使用存储库路径执行,它会向STDOUT打印关于受存储库中所有提交的 影响的文件的信息。例如,假设存储库被存储在/ SVN /回购/测试在 Subversion服务器:

$ perl svn-commit-info.pl /svn/repos/test 
# Repository: /svn/repos/test 
# Fields: Action, Revision, Date, Author, Bytes, Path 
# Actions: A = New, D = Deleted, U = Updated 
A 1  2017-01-31 17:21:19  Samsa  <DIR> TestProject/ 
A 2  2017-01-31 17:21:33  Samsa  815 TestProject/.project 
A 2  2017-01-31 17:21:33  Samsa  <DIR> TestProject/.settings/ 
A 2  2017-01-31 17:21:33  Samsa  564 TestProject/.settings/.jsdtscope 
A 2  2017-01-31 17:21:33  Samsa  <DIR> TestProject/www/ 
A 3  2017-01-31 17:27:48  David  355 TestProject/www/test.html 
A 3  2017-01-31 17:27:48  David  <DIR> TestProject/www/css/ 
A 3  2017-01-31 17:27:48  David  9622 TestProject/www/css/logo.jpg 
A 3  2017-01-31 17:27:48  David  1231 TestProject/www/css/reportstyle.css 
A 3  2017-01-31 17:27:48  David 168345 TestProject/www/css/style.css 
U 4  2017-02-01 10:48:34  Samsa 183260 TestProject/www/css/style.css 
D 5  2017-02-01 12:51:26  David  355 TestProject/www/test.html    

的制表符分隔字段是:所执行的操作,版本号,日期和时间,作者 文件大小(以字节为单位)(除非文件是由字符串“<DIR>”标记的目录)以及 存储库中受影响文件的路径。前三行包含关于输出的以人为本的评论。

如果存储库很大,并且有很多文件或修订版本,则前一个命令的输出可能需要很长时间才能完成。如果您想跟踪对特定文件(或一组文件)所做的更改,最好指定文件模式(实际上,它是一个Perl正则表达式) 。例如,要获取有关文件style.css中所做的更改 信息:

$ perl svn-commit-info.pl /svn/repos/test style.css 

如果你有兴趣在一个特定的版本,您可以指定第三个参数。例如,要打印第三个修订版的所有更改 ,并考虑到'。'任何字符在Perl的正则表达式匹配:

$ perl svn-commit-info.pl /svn/repos/test . 3 

当然,你可以利用Unix的过滤器和管道做更复杂的查询的权力,例如 找到用户David所做的所有修改:

$ svn-commit-info.pl /svn/repos/test | grep David 

要找到大小> = 1Mb的创建的所有文件:

$ svn-commit-info.pl /svn/repos/test | awk '$1 = "A" && $6 ~ /[0-9]/ && $6 >= 1024*1024' 

该脚本使用标准的Subversion命令“svnlook的“但除此之外它是独立的。 是构建命令和获得“svnlook”输出的两个帮助函数,然后连续调用 该命令组成输出。它需要Subversion> = 1.7,并且它已经在Perl 5.10上测试了 。

#!/usr/bin/env perl 
use strict; 

my $SVNLOOKCMD = "/usr/bin/svnlook"; 
my @FIELDS = qw(Action Revision Date Author Bytes Path); 

# Builds and returns the "svnlook" command 
sub svnlook_cmd { 
    my($repository, $action, $revision, @varargs) = @_; 
    my $cmd = $SVNLOOKCMD; 
    $cmd.= " -r $revision" if $revision; 
    $cmd.= " $action '$repository'"; 
    $cmd.= join "", map { " '$_'" } @varargs; 
    $cmd.= '|'; 
    return $cmd; 
} 

# Executes the "svnlook" command and returns the output lines 
sub svnlook_output { 
    my($repository, $action, $revision, @varargs) = @_; 
    open(my $svnlookfh, svnlook_cmd $repository, $action, $revision, @varargs); 
    my @output = <$svnlookfh>; 
    close $svnlookfh; 
    chomp @output; 
    return wantarray ? @output : $output[0]; 
} 

my($repository, $file, $revision) = @ARGV; 
unless($repository) { 
    # 'repository' is the only mandatory argument 
    print STDERR "$0 <repository> [<file>] [<revision>]\n"; 
    print STDERR "\t<repository> = path of Subversion repository\n"; 
    print STDERR "\t<file> = file pattern to search for (regular expression)\n"; 
    print STDERR "\t<revision> = commit revision number\n"; 
    exit 1; 
} 
$file = "." unless $file; 
my $first = $revision ? $revision : 1; 
my $last = $revision ? $revision : svnlook_output $repository, "youngest"; 
print "# Repository: $repository\n"; 
print "# Fields: ", join(", ", @FIELDS), "\n"; 
print "# Actions: A = New, D = Deleted, U = Updated\n"; 
for(my $rev = $first; $rev <= $last; $rev++) { 
    my $author = ""; 
    my $date = ""; 
    foreach my $line (svnlook_output $repository, "changed", $rev) { 
     if($line =~ /$file/i) { 
      unless($date) { 
       $date = svnlook_output $repository, "date", $rev; 
       $date =~ s|^(\S+) (\S+).*$|\1 \2|; 
      } 
      $author = uc svnlook_output $repository, "author", $rev unless $author; 
      my($action, $path) = split /\s+/, $line, 2; 
      my $size; 
      if($path =~ m|/$|) { 
       $size = sprintf("%12s", "<DIR>"); 
      } else { 
       $size = svnlook_output $repository, "filesize", $rev, $path; 
       $size = sprintf("%12d", $size); 
      } 
      print join("\t", $action, $rev, $date, $author, $size, $path), "\n"; 
     } 
    } 
} 
exit 0; 

希望这有助于和长期发帖抱歉。