我们正在迁移到 SVN。
不幸的是,我们定期接受审计,审计员需要以下信息:
文件更改
历史 SVN 访问历史
新文件 添加 文件
更改
是否有工具可以为我们(或其中一些)生成这些报告?
Trac ( http://trac.edgewall.com ) 可用于查看 SVN 详细信息。Trac 具有不错的功能,例如允许查看不同的变更集(并在它们之间来回切换)的变更集视图。它还提供了一个漂亮的用户界面,比 ViewVC(www.viewvc.org) 好得多
svn log是获取您要查找的文件相关信息的基本命令...
您可以通过 SVN 修订日志获得所有这些信息。不过,您可能想考虑使用像Fisheye这样的好工具来为您完成这项工作。
SVN 直接从命令行提供了您所要求的大部分内容:
svn log /your/path
为您提供源代码差异、作者、签入日期等。svnlook changed -r <rev> <path to repository>
为您提供在给定修订版中涉及的所有文件。循环遍历所有相关的修订,以及grep
表示添加文件的“A”。svn diff -r <first rev>:<last rev> <path>
为您提供整个修订范围的差异svn log
)。至于读取权限,我不知道内置机制,但是您可以轻松创建自己的机制,具体取决于配置。如果您只允许 http 访问,您可以使用网络服务器的日志文件。它不是很漂亮,但是 SVN 的输出是高度结构化的,因此您可以轻松地进行自己的格式化。
以下是我之前使用的一些内容,可让我一目了然地了解变更活动报告和趋势。过滤并不完美,但您可以理解:
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
看看codesaga。它很好地可视化了源代码控制提交。我不能保证报告部分。
这个程序可能会帮助你,不是审计,而是更新
http://www.svnmonitor.com/default.shtml
要查看对 SVN 的实际访问,您需要解析 Apache 服务器日志(假设您通过 Apache 提供 SVN)。
这个问题也有点老了,但我制作了一个脚本,它可能对 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;
希望这会有所帮助,并对长篇文章感到抱歉。