6

我们正在迁移到 SVN。

不幸的是,我们定期接受审计,审计员需要以下信息:
文件更改
历史 SVN 访问历史
新文件 添加 文件
更改

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

4

10 回答 10

7

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

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

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

StatSVN提供指标列表:

  • 哪个文件变化最大
  • 添加了多少行
  • 谁贡献更多
于 2009-01-21T23:39:19.283 回答
4

Trac ( http://trac.edgewall.com ) 可用于查看 SVN 详细信息。Trac 具有不错的功能,例如允许查看不同的变更集(并在它们之间来回切换)的变更集视图。它还提供了一个漂亮的用户界面,比 ViewVC(www.viewvc.org) 好得多

于 2009-01-21T19:30:04.310 回答
2

svn log是获取您要查找的文件相关信息的基本命令...

于 2009-01-21T19:17:23.870 回答
2

您可以通过 SVN 修订日志获得所有这些信息。不过,您可能想考虑使用像Fisheye这样的好工具来为您完成这项工作。

于 2009-01-21T19:17:33.557 回答
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 访问,您可以使用网络服务器的日志文件。

它不是很漂亮,但是 SVN 的输出是高度结构化的,因此您可以轻松地进行自己的格式化。

于 2009-01-21T19:36:58.307 回答
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
于 2009-01-21T21:52:21.420 回答
0

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

于 2009-01-21T19:21:41.643 回答
0

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

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

  • 监视某些事件的来源
  • 发生某些事件时接收任何类型的通知(气球弹出窗口、托盘图标、电子邮件、声音等)
于 2009-01-21T19:22:24.607 回答
0

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

于 2009-01-21T21:03:17.900 回答
0

这个问题也有点老了,但我制作了一个脚本,它可能对 Subversion 的简单报告/审计以及跟踪对 SVN 存储库所做的更改很有用,我想分享它。它以类似于命令“svnlook”的方式提取有关 SVN 提交的信息,但它有两个优点。首先,它允许迭代存储库的所有修订以跟踪所做的所有更改。其次,信息以制表符分隔的表格格式(如 ps 或 df 等 Unix 命令)打印,这种格式既易于阅读,又易于解析或导入电子表格,非常适合报告。它也可以被调用或嵌入到 SVN 提交后挂钩中。

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

如果仅使用存储库路径执行,它将向 STDOUT 打印有关受存储库中所做的所有提交影响的文件的信息。例如,假设存储库存储在 Subversion 服务器的 /svn/repos/test 中:

$ 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;

希望这会有所帮助,并对长篇文章感到抱歉。

于 2017-02-02T13:57:31.403 回答