我们正在迁移到SVN。
对我们来说不幸的是,我们会定期接受审计,审计员需要这样的信息:
文件更改的历史记录
访问SVN的历史
新文件已添加
文件更改
是否有可以为我们(或其中一些)生成这些报告的工具?
答案 0 :(得分:6)
StatSVN
是一个轻量级的颠覆报告生成器。
http://www.statsvn.org/
答案 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 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;
希望这对长篇文章有帮助和抱歉。