Câu hỏi này cũng hơi cũ, nhưng tôi đã tạo ra một kịch bản có thể hữu ích cho việc báo cáo/kiểm toán đơn giản của Subversion d để theo dõi các thay đổi được thực hiện cho một kho lưu trữ SVN và tôi muốn chia sẻ nó. Nó trích xuất thông tin về SVN cam kết theo cách tương tự với lệnh "svnlook" nhưng nó có một cặp lợi thế. Đầu tiên, nó cho phép lặp qua tất cả các phiên bản của một kho lưu trữ để theo dõi tất cả các thay đổi được thực hiện. Thứ hai, thông tin được in ở định dạng bảng được phân tách bằng tab (như trong các lệnh Unix như ps hoặc df), cả hai đều có thể đọc được và dễ phân tích hoặc nhập vào bảng tính, đây là điều tuyệt vời để báo cáo. Nó cũng có thể được gọi là hoặc được nhúng trong một móc đăng bài SVN.
Đây là một tập lệnh Perl có tên là svn-commit-info.pl và có ba đối số. Đầu tiên là đường dẫn kho lưu trữ và nó là bắt buộc. Thứ hai, tùy chọn, là mẫu tệp để tìm kiếm. Và thứ ba, cũng là tùy chọn, là số sửa đổi để truy vấn.
Nếu được thực hiện chỉ với đường dẫn lưu trữ, nó sẽ in ra thông tin STDOUT về các tệp bị ảnh hưởng bởi tất cả các cam kết được thực hiện trong kho lưu trữ. Ví dụ, giả sử các kho lưu trữ được lưu trữ trong/svn/Repos/kiểm tra trong máy chủ 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
Các lĩnh vực tách biệt bởi tab là: các hoạt động biểu diễn, số phiên bản, ngày và thời gian, tác giả của bản sửa đổi, kích thước tệp tính bằng byte (trừ khi tệp là thư mục được đánh dấu bằng chuỗi "<DIR>") và đường dẫn của tệp bị ảnh hưởng trong kho lưu trữ . Ba dòng đầu tiên chứa ý kiến định hướng của con người về đầu ra.
Đầu ra của lệnh cũ có thể mất nhiều thời gian để hoàn thành nếu kho lưu trữ lớn, có nhiều tệp hoặc sửa đổi. Nếu bạn muốn theo dõi các thay đổi được thực hiện cho một tệp cụ thể (hoặc tập hợp các tệp), thì tốt hơn là để chỉ định mẫu tệp (thực tế, đó là một regexp Perl). Ví dụ, để có được thông tin về những thay đổi thực hiện cho các tập tin style.css:
$ perl svn-commit-info.pl /svn/repos/test style.css
Nếu bạn quan tâm đến một phiên bản đặc biệt, bạn có thể chỉ định tham số thứ ba. Ví dụ để in tất cả các thay đổi của bản sửa đổi thứ ba, có tính đến '.' phù hợp với bất kỳ ký tự trong một biểu thức chính quy Perl:
$ perl svn-commit-info.pl /svn/repos/test . 3
Và tất nhiên bạn có thể khai thác sức mạnh của các bộ lọc Unix và pipelining để làm các truy vấn phức tạp hơn, ví dụ để tìm thấy tất cả những sửa đổi được thực hiện bởi người sử dụng David:
$ svn-commit-info.pl /svn/repos/test | grep David
Để tìm tất cả các tập tin được tạo ra với kích thước> = 1Mb:
$ svn-commit-info.pl /svn/repos/test | awk '$1 = "A" && $6 ~ /[0-9]/ && $6 >= 1024*1024'
các kịch bản sử dụng lệnh Subversion tiêu chuẩn "svnlook "nhưng nếu không nó là khép kín. Có là hai hàm trợ giúp để xây dựng lệnh và nhận đầu ra của "svnlook" và sau đó kết nối các cuộc gọi liên tiếp đến lệnh để soạn kết quả đầu ra. Nó đòi hỏi Subversion> = 1.7 và nó có được thử nghiệm trên 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;
Hy vọng điều này sẽ giúp và xin lỗi cho bài đăng dài.
Trình theo dõi vấn đề nào bạn sử dụng? Thông thường, trình theo dõi vấn đề cung cấp một số báo cáo về repo. – Joshua
Chúng tôi sử dụng trình theo dõi vấn đề được tạo tùy chỉnh, không tương thích với bất kỳ thứ gì. – Bravax