什么报告可用于svn?

时间:2009-01-21 19:10:36

标签: svn audit

我们正在迁移到SVN。

对我们来说不幸的是,我们会定期接受审计,审计员需要这样的信息: 文件更改的历史记录 访问SVN的历史
新文件已添加
文件更改

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

10 个答案:

答案 0 :(得分:6)

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

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

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

  3. StatSVN提供了指标列表:

    • 哪个文件更改
    • 添加了多少行
    • 谁贡献更多

答案 1 :(得分:4)

Trac(http://trac.edgewall.com)可用于查看SVN详细信息。 Trac具有很好的功能,例如变更集视图,可以查看不同的变更集(以及来回穿过它们)。它还提供了一个很好的UI,比ViewVC(www.viewvc.org)

更好

答案 2 :(得分:2)

svn log是获取您正在寻找的文件相关信息的基本命令......

答案 3 :(得分:2)

您可以通过SVN修订日志获取所有这些信息。你可能想考虑一个像Fisheye这样的好工具来为你做这件事。

答案 4 :(得分: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的输出结构很高,因此您可以轻松地进行自己的格式化。

答案 5 :(得分: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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

此程序可能会帮助您,而不是审核,而是更新

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

  • 监控某些事件的来源
  • 在发生特定事件时接收任何类型的通知(气球弹出窗口,托盘图标,电子邮件,声音......)

答案 8 :(得分:0)

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

答案 9 :(得分:0)

这个问题也有点陈旧,但我制作了一个脚本,可能对Subversion的简单报告/审核有用,并跟踪对SVN存储库所做的更改,我想分享它。它提取 有关SVN的信息以与命令类似的方式提交&#34; svnlook&#34;但它有一对优点。首先,它允许迭代存储库的所有修订版以跟踪所做的所有更改。第二, 信息以制表符分隔的表格格式打印(如在ps或df等Unix命令中),既可人类阅读,又易于解析或导入电子表格,非常适合报告。它也可以被称为或 嵌入在SVN后提交钩子中。

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

如果仅使用存储库路径执行,则会向STDOUT打印有关受所有文件影响的文件的信息 在存储库中进行的提交。例如,假设存储库存储在/ svn / repos / test中 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            

以制表符分隔的字段为:执行的操作,修订号,日期和时间,修订的作者, 文件大小(以字节为单位)(除非文件是由字符串&#34标记的目录;&lt; DIR&gt;&#34;)以及受影响文件的路径 库。前三行包含关于输出的以人为本的评论。

如果存储库很大,那么前一个命令的输出可能需要很长时间才能完成,包含许多文件或 修订。如果要跟踪对特定文件(或一组文件)所做的更改,则更好 指定文件模式(实际上,它是Perl regexp)。例如,获取有关更改的信息 发送到文件style.css:

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

如果您对特定修订感兴趣,可以指定第三个参数。例如,打印所有更改 第三次修订,考虑到&#39;。&#39;匹配Perl正则表达式中的任何字符:

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

当然,您可以利用Unix过滤器和流水线技术的强大功能来执行更复杂的查询,例如 找到用户David所做的所有修改:

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

查找使用尺寸&gt; = 1Mb创建的所有文件:

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

该脚本使用标准的Subversion命令&#34; svnlook&#34;但除此之外它是自成一体的。那里 是两个辅助函数来构建命令并获得&#34; svnlook&#34;的输出。然后连续打电话给 组成输出的命令。它需要Subversion&gt; = 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;

希望这对长篇文章有帮助和抱歉。