题
我们正在移动的过程中SVN.
不幸的是我们,我们的审计周期,审计委员会要求的信息,如:
历史的变化文件
历史的访问SVN
新添加的文件
改变在文件
是有一个工具,它可以产生这些报告对我们(或一些)?
解决方案
其他提示
Trac系统( http://trac.edgewall.com )可被用于查看SVN细节。 Trac系统具有良好的特性,如变更视图,允许看到不同的变更(去向后或向前通过它们)。它也提出了一个很好的用户界面,比ViewVC好得多(www.viewvc.org)
SVN登录是基本命令来获取相关的文件信息你正在寻找...
您可以拥有所有的这些信息只是通过SVN版本日志。你可能要考虑一个很好的工具如鱼眼来,虽然这样做对你。
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的输出是高度结构化所以你可以做你自己的格式,很容易。
下面是一些我以前用来给处于变革活动报告和趋势一目了然。过滤是不完美的,但你可以得到的想法:
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服务器日志(假设你的服务SVN超过阿帕奇)。
这问题也有点老了,但我已经制作了一个脚本,可能是颠覆简单的报告/审计有用的,并且可以跟踪到一个SVN仓库所做的更改,我想分享它。它提取 关于SVN信息提交以类似的方式对命令“svnlook的”,但它具有一对优点。首先,它允许遍历版本库的所有修订,以保持所做的所有更改轨道。二, 信息被印刷在一个制表符分隔表格格式(如Unix命令等PS或DF)是人可读和易于解析或导入到电子表格中,这是很大的用于报告。它也可以被称为或 嵌入在SVN post-commit钩子。
有一个Perl脚本称为svn-commit-info.pl和三个参数。首先是资料库路径 它是强制性的。第二,可选的,是搜索的文件模式。第三,也是可选的,是 版本号来查询。
如果仅与储存库路径执行,它打印至约受所有文件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
在制表符分隔字段是:所执行的操作,版本号,日期和时间,修改的作者, 以字节为单位的文件大小(除非该文件是由字符串标记的目录“
前者命令的输出可能需要很长的时间来完成,如果存储库是大,有许多文件或 修订。如果你想跟踪一个特定的文件(或一组文件)所做的更改,这是更好 指定文件模式(即,实际上是一个Perl的regexp)。例如,要获取有关更改的信息 到文件的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”一输出,并随后mades连续调用 该命令以构成输出。它需要的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;
希望这有助于和遗憾的长柱。