Pertanyaan Bagaimana cara mencari semua revisi file dalam repositori SubVersion?


aku suka untuk grep semua revisi file untuk string. misalnya untuk menemukan ketika suatu fungsi ditambahkan atau dihapus.

Apakah ada cara sederhana untuk melakukan hal ini? (mis. tunggal bash baris perintah akan menyenangkan.) Melakukan pencarian biner manual dengan memeriksa revisi dan pengujian secara individual tampaknya terlalu membosankan dan rawan kesalahan.

Jika saya cukup pintar untuk melakukan perubahan dengan deskripsi yang bermanfaat maka saya bisa grep log dengan sesuatu seperti:

svn log myfile.c | grep my_func

Ini tidak memberikan nomor revisi, jadi saya curiga ada cara yang lebih baik untuk melakukannya juga.


32
2017-07-13 07:10


asal


Jawaban:


Saya menulis naskah untuk melakukannya

Penggunaan tipikal:

perl searchrev.pl Import.php setImportStatus

----------------------------------------------------------------------
r19565 | johnf | 2009-06-24 14:33:00 +0100 (Wed, 24 Jun 2009) | 1 line
----------------------------------------------------------------------
line 60 $this->setImportStatus($entity_id, $entity_attr_id);
---------------------------------------------------------------------
r13722 | john | 2008-03-10 17:06:14 +0000 (Mon, 10 Mar 2008) | 1 line
---------------------------------------------------------------------
line 70 $this->setImportStatus($entity_id, $entity_attr_id);
---------------------------------------------------------------------
r11692 | paul | 2007-05-23 10:55:45 +0100 (Wed, 23 May 2007) | 1 line
---------------------------------------------------------------------
Not found
---------------------------------------------------------------------
r11691 | paul | 2007-05-23 10:36:26 +0100 (Wed, 23 May 2007) | 1 line
---------------------------------------------------------------------
Not found
---------------------------------------------------------------------
r11683 | paul | 2007-05-23 09:04:29 +0100 (Wed, 23 May 2007) | 1 line
---------------------------------------------------------------------
Not found

Berikut skripnya, mudah di-hack untuk keperluan Anda sendiri

#!/usr/bin/perl -w

my $file=$ARGV[0];
my $pattern=$ARGV[1];

my @history=`svn log $file`;
foreach (@history)
{
    chomp;
    if (m/^r(\d+)/)
    {
        my $revision=$1;
        my $sep='-' x length($_);

        print "$sep\n$_\n$sep\n";

        my @code=`svn cat -r $revision $file`;
        my $lineno=0;
        my $found=0;
        foreach my $line (@code)
        {
            $lineno++;
            if ($line=~m/$pattern/)
            {
                $line=~s/^\s+//;
                print "line $lineno $line";
                 $found=1;
            }
        }

        print "Not found\n" unless ($found);
    }
}

32
2017-07-15 10:12



Itu Perintah "annotate / blame" tidak melakukan apa yang Anda inginkan, tetapi bisa membantu:

svn blame - Tampilkan informasi pembuat dan revisi in-line untuk file atau URL yang ditentukan.

 $ svn blame http://svn.red-bean.com/repos/test/readme.txt
 3      sally This is a README file.
 5      harry You should read this.

Jadi, Anda harus dapat mengetahui siapa yang menambahkan fungsi. Adapun mencari tahu siapa yang menghapus fungsi, tidak tahu.


7
2017-07-13 08:07



Dengan server Subversion 1.6 dan mod_dav_svn Anda dapat menentukan nomor revisi melalui parameter GET:

http://host/repos/path?r=20

Jadi Anda bisa dengan mudah wget file Anda di semua revisi dan kemudian diff mereka.

Sumber: SVN 1.6 changelog


3
2017-07-13 08:41



Ini adalah perintah untuk mencari revisi file yang berisi string:

svn log -l 30 -q FILENAME | grep ^r | cut -d ' ' -f 1 | while read rev; do
    svn cat -$rev FILENAME | grep -c PATTERN && svn info FILENAME@$rev
done

2
2018-03-11 09:19



Hal pertama yang ingin Anda lakukan akan sulit. Saya biasanya menyarankan menggunakan svn diff atau svn cat, tetapi ada (sejauh yang saya tahu) tidak ada cara untuk mendapatkan nomor revisi sesuai dengan output kode.

Pada pertanyaan kedua, jika Anda mencari pengguna tertentu, Anda dapat menggunakan

svn log | grep -A 2 username

yang akan memberi Anda dua baris tambahan setelah setiap baris yang cocok (-A = "setelah"). Jika Anda tidak memiliki pesan log yang sangat panjang, Anda dapat menggunakannya

svn log | grep -B 2 search_string

yang juga akan mencetak dua baris sebelum (-B) setiap baris yang cocok. (Yang semestinya cukup untuk memberi Anda nomor revisi.) Saya benar-benar yakin bahwa ada cara yang lebih baik dengan AWK untuk memberi Anda nomor revisi sesuai dengan pesan log, tapi saya lelah dan saya tidak bisa berpikir itu sekarang. : D


1
2017-07-13 07:24



Sejauh yang saya tahu itu tidak mungkin dengan mudah. Saya akan menulis skrip kecil yang mengambil setiap changeset untuk file yang dimaksud dan kemudian grep melalui diff untuk string. Maka itu sesederhana mencetak nomor revisi saat ini :)


0
2017-07-13 08:33



Anda bisa menggunakan pySVN + python alat diff untuk melakukan ini, meskipun tidak bash, mungkin layak dipertimbangkan jika Anda menggunakan fungsi ini secara lebih teratur. Ini adalah versi dari solusi wget tetapi akan memiliki antarmuka yang lebih bagus, yah jika Anda membuatnya :)


0
2017-07-13 15:51