Какие отчеты доступны для svn?

Мы находимся в процессе перехода на SVN.

К сожалению для нас, нас периодически проверяют, когда аудиторам требуется такая информация, как:
Истории изменений в файлах
История доступа к SVN
Добавлены новые файлы
Изменения в файлах

Есть ли инструмент, который может создавать для нас эти отчеты (или некоторые из них)?


person Bravax    schedule 21.01.2009    source источник
comment
Каким трекером проблем вы пользуетесь? Обычно средство отслеживания проблем предоставляет некоторые отчеты о репо.   -  person Joshua    schedule 21.01.2009
comment
Мы используем специально созданный трекер проблем, который ни с чем не совместим.   -  person Bravax    schedule 21.01.2009


Ответы (10)


StatSVN — это легкий генератор отчетов о подрывной деятельности. http://www.statsvn.org/

  1. сначала создайте подробный файл журнала - svn log

  2. запустите StatSVN , это один JAR-файл.

StatSVN предоставляет список показателей:

  • какой файл больше всего изменился
  • сколько линий добавлено
  • кто вносит больший вклад
person sundar venugopal    schedule 21.01.2009
comment
обе ссылки на StatSVN — 404. Кажется, это новое место: github.com/tetherless -world/opendap/wiki/StatSVN - person Jim; 14.11.2019

Trac (http://trac.edgewall.com) можно использовать для просмотра сведений SVN. В Trac есть приятные функции, такие как просмотр наборов изменений, который позволяет просматривать различные наборы изменений (и перемещаться по ним вперед или назад). Он также имеет приятный пользовательский интерфейс, намного лучше, чем ViewVC (www.viewvc.org).

person rajasaur    schedule 21.01.2009
comment
Кроме того, это также средство отслеживания проблем и система управления проектами (распределение задач по вехам, построение дорожной карты и т. д.). - person stpe; 22.01.2009

svn log — это основная команда для получения информации, связанной с файлом. ищешь...

person Jason Punyon    schedule 21.01.2009

Вы можете получить всю эту информацию только через журналы изменений SVN. Тем не менее, вы можете рассмотреть хороший инструмент, такой как Fisheye, который сделает это за вас.

person Kevin    schedule 21.01.2009

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 хорошо структурированы, поэтому вы можете легко выполнить собственное форматирование.

person Simon    schedule 21.01.2009
comment
svn log --xml дает вам полный вывод журнала в формате xml, который может быть проще, чем разбор свободного текста. - person jdkoftinoff; 22.01.2009

Вот некоторые из них, которые я использовал ранее, чтобы дать представление об отчетах об изменениях и тенденциях. Фильтрация не идеальна, но вы можете получить представление:

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
person Community    schedule 21.01.2009

Взгляните на codesaga. Он хорошо визуализирует коммиты системы управления версиями. За отчетную часть не ручаюсь.

person Cristian Libardo    schedule 21.01.2009

Эта программа может помочь вам не с проверками, а с обновлениями

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

  • Мониторинг источника для определенных событий
  • Получайте уведомления любого типа (всплывающие всплывающие окна, значки в трее, электронная почта, звуки и т. д.) при возникновении определенных событий.
person ccook    schedule 21.01.2009

Чтобы увидеть фактический доступ к SVN, вам нужно проанализировать журналы сервера Apache (при условии, что вы обслуживаете SVN через Apache).

person orip    schedule 21.01.2009

Этот вопрос также немного устарел, но я создал сценарий, который может быть полезен для простой отчетности/аудита Subversion и для отслеживания изменений, внесенных в репозиторий SVN, и я хотел поделиться им. Она извлекает информацию о коммитах SVN аналогично команде «svnlook», но имеет пару преимуществ. Во-первых, он позволяет перебирать все версии репозитория, чтобы отслеживать все внесенные изменения. Во-вторых, информация печатается в табличном формате, разделенном табуляцией (как в командах Unix, таких как ps или df), который удобен для чтения человеком и легко анализируется или импортируется в электронную таблицу, что отлично подходит для отчетов. Его также можно вызывать или встраивать в хук после фиксации SVN.

Это Perl-скрипт с именем svn-commit-info.pl, который принимает три аргумента. Первый — это путь к репозиторию, и он является обязательным. Второй, необязательный, — это шаблон файла для поиска. И третий, также необязательный, — номер версии для запроса.

Если выполняется только с путем к репозиторию, он выводит в 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            

Поля, разделенные табуляцией: выполненная операция, номер редакции, дата и время, автор редакции, размер файла в байтах (если файл не является каталогом, отмеченным строкой «‹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 для выполнения более сложных запросов, например, для поиска всех изменений, сделанных пользователем Дэвидом:

$ svn-commit-info.pl /svn/repos/test | grep David

Чтобы найти все созданные файлы размером >= 1 Мб:

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

Надеюсь, это поможет и извините за длинный пост.

person David Gil del Rosal    schedule 02.02.2017