سؤال

نحن بصدد الانتقال إلى SVN.

لسوء الحظ بالنسبة لنا، يتم تدقيقنا بشكل دوري، حيث يطلب المدققون معلومات مثل:
تاريخ التغييرات على الملفات
تاريخ الوصول إلى SVN
تمت إضافة ملفات جديدة
التغييرات في الملفات

هل هناك أداة يمكنها إنتاج هذه التقارير لنا (أو بعضها)؟

هل كانت مفيدة؟

المحلول

StatSVN هو مولد تقرير التخريب خفيف الوزن.http://www.statsvn.org/

  1. قم أولاً بإنشاء ملف السجل المطول - svn log

  2. يجري StatSVN ، إنه ملف جرة واحد.

StatSVN يوفر قائمة المقاييس:

  • الملف الذي تم تغييره أكثر
  • كم عدد الخطوط المضافة
  • من يساهم أكثر

نصائح أخرى

وتراك ( http://trac.edgewall.com ) يمكن استخدامها لعرض تفاصيل SVN. تراك لديها ميزات جميلة مثل وجهة نظر changeset التي تسمح لرؤية changesets مختلفة (والعودة أو إيابا من خلالهم). كما يعرض واجهة لطيفة، أفضل بكثير من ViewVC (www.viewvc.org)

إس تسجيل هو الأمر الأساسي للحصول على ملف ذي صلة المعلومات التي تبحث عنها ...

هل يمكن أن يكون كل تلك المعلومات فقط من خلال سجلات المراجعة 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 "/"

وChangesets:

%COMMAND% | find /c "Changed paths"

وقائمة من الملفات الفريدة التي تأثرت على نطاق المراجعة معين (كنت قد ركبت سيغوين):

%COMMAND% | findstr /r %REG_EXPRESSION% | sort | uniq -u

ونلقي نظرة على codesaga . يجعل بعمل جيد لتصور يرتكب التحكم بالمصادر. لا أستطيع أن يشهدوا للجزء التقارير.

قد يساعدك هذا البرنامج، ليس في عمليات التدقيق، بل في التحديثات

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

  • مراقبة المصدر لأحداث معينة
  • تلقي إشعارات من أي نوع (النوافذ المنبثقة، أيقونات الدرج، البريد الإلكتروني، الأصوات، ...) عند وقوع أحداث معينة

لمعرفة المداخل الفعلية لSVN، وكنت بحاجة إلى تحليل سجلات الخادم أباتشي (على افتراض أنك تخدم SVN على أباتشي).

وهذا السؤال هو أيضا قديمة بعض الشيء، ولكني وضعت السيناريو التي قد تكون مفيدة للبسيط الإبلاغ / مراجعة التخريب ولتتبع التغييرات التي أدخلت على مستودع SVN وكنت أرغب في المشاركة فيها. انها مقتطفات معلومات حول SVN تلتزم بطريقة مماثلة إلى الأمر "svnlook" ولكن لديها زوج من المزايا. أولا، لأنها تتيح لتكرار عبر كافة المراجعات من مستودع لتتبع كل التغييرات التي تم إجراؤها. ثانيا، تتم طباعة المعلومات في شكل جداول مفصول (كما في أوامر يونكس مثل ملاحظة أو مدافع) في آن معا يمكن قراءته والسهل تحليل أو لاستيراد جدول بيانات، وهو عظيم لتقديم التقارير. ويمكن أيضا أن يسمى أو جزءا لا يتجزأ من SVN بعد ارتكاب الخطاف.

وهو بيرل النصي دعا svn-commit-info.pl ويأخذ ثلاث حجج. الأول هو مسار مستودع وإلزامي. الثانية، اختيارية، هو نمط ملف للبحث. والثالث، كما اختياري، هو رقم مراجعة الاستعلام.

إذا أعدم فقط مع مسار مستودع، فإنه يطبع على المعلومات STDOUT حول الملفات التي تأثرت جميع يرتكب المحرز في المخزون. على سبيل المثال، على افتراض مستودع يتم تخزينها في / إس / اتفاقيات إعادة الشراء / اختبار في خادم التخريب:

$ 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            

والحقول مفصول هي: تنفيذ العملية، ورقم المراجعة، التاريخ والوقت، ومؤلف كتاب التنقيح، و حجم الملف بالبايت (إلا إذا كان الملف هو دليل والتي تمثلت في سلسلة "

") ومسار ملف المتضررين في مخزن. الأسطر الثلاثة الأولى تحتوي على المنحى الإنسان تعليقات حول الإخراج.

وإخراج الأمر السابق يمكن أن يستغرق وقتا طويلا لإكمال إذا مستودع كبير، مع العديد من الملفات أو التنقيحات. إذا كنت تريد أن تتبع التغييرات التي أدخلت على ملف معين (أو مجموعة من الملفات)، فمن الأفضل لتحديد نمط ملف (وهذا، في الواقع، هو التعبير العادي بيرل). على سبيل المثال، للحصول على معلومات حول التغييرات التي أدخلت على style.css الملف:

$ perl svn-commit-info.pl /svn/repos/test style.css

إذا كنت ترغب في إعادة النظر معين، يمكنك تحديد المعلمة الثالثة. على سبيل المثال لطباعة كل التغييرات من التنقيح الثالث، مع الأخذ بعين الاعتبار أن ''. يطابق أي حرف في تعبير عادي بيرل:

$ perl svn-commit-info.pl /svn/repos/test . 3

وبالطبع يمكن تسخير قوة من المرشحات يونكس والنقل بواسطة خط أنابيب للقيام استعلامات أكثر تعقيدا، على سبيل المثال ل العثور على كل التعديلات التي تم إجراؤها من قبل المستخدم ديفيد:

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

والسيناريو يستخدم معيار التخريب قيادة "svnlook" لكن على خلاف ذلك فمن يرد النفس. هناك هما وظائف المساعد لبناء القيادة والحصول على إخراج "svnlook" ويدعو ثم شغاله المتعاقبة ل الأمر أن يؤلف الإخراج. ويتطلب ذلك التخريب> = 1.7 ولها تم اختبارها على بيرل 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;

ويساعد هذا الأمل وآسف لمنصب طويلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top