Как найти все версии файла в хранилище SubVersion? - PullRequest
32 голосов
/ 13 июля 2009

Я бы хотел grep все ревизии файла для строки. например чтобы найти, когда функция была добавлена ​​или удалена.

Есть ли "простой" способ сделать это? (то есть, единственная командная строка bash была бы хороша.) Выполнение ручного двоичного поиска путем проверки изменений и индивидуального тестирования кажется слишком утомительным и подверженным ошибкам.

Если я был достаточно умен, чтобы зафиксировать изменение с полезным описанием, тогда я могу grep записать в журнал что-то вроде:

svn log myfile.c | grep my_func

Это не дает номер ревизии, поэтому я подозреваю, что есть и лучший способ сделать это.

Ответы [ 7 ]

34 голосов
/ 15 июля 2009

Я написал скрипт для этого

Типичное использование:

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

Вот скрипт, который легко взломать для ваших собственных целей

#!/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);
    }
}
7 голосов
/ 13 июля 2009

Команда «аннотировать / обвинять» не делает именно то, что вам нужно, но может помочь:

svn blame - Показать информацию об авторе и ревизии для указанных файлов или URL-адресов.

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

Итак, вы сможете узнать, кто добавил функцию. Что касается выяснения, кто удалил функцию, понятия не имею.

3 голосов
/ 13 июля 2009

С сервером Subversion 1.6 и его mod_dav_svn вы можете указать номер редакции с помощью параметра GET:

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

Таким образом, вы можете легко wget свои файлы во всех ревизиях, а затем diff их.

Источник: Журнал изменений SVN 1.6

2 голосов
/ 11 марта 2016

Это команда для поиска ревизий файла, содержащего строку:

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
1 голос
/ 13 июля 2009

Первое, что вы хотите сделать, будет трудно. Обычно я бы предложил использовать svn diff или svn cat, но (насколько я знаю) нет способа получить номер ревизии в соответствии с выводом кода.

По второму вопросу, если вы ищете конкретного пользователя, вы можете использовать

svn log | grep -A 2 username

, который даст вам две дополнительные строки после каждой совпавшей строки (-A = "after"). Если у вас нет очень длинных сообщений журнала, вы можете использовать

svn log | grep -B 2 search_string

, который аналогичным образом будет печатать две строки перед (-B) каждой совпавшей строкой. (Надеюсь, этого будет достаточно, чтобы дать вам номер редакции.) Я абсолютно уверен, что с AWK есть лучший способ дать вам номера редакций в соответствии с сообщениями журнала, но я устал и не могу думать об этом прямо сейчас. : D

0 голосов
/ 13 июля 2009

Вы можете использовать pySVN + инструменты python diff , чтобы сделать это, хотя это не bash, возможно, стоит подумать, если вы используете эту функцию на более регулярной основе. Это версия решения wget , но с более приятным интерфейсом, хорошо, если вы создадите его:)

0 голосов
/ 13 июля 2009

Насколько я знаю, это не легко возможно. Я написал бы небольшой скрипт, который бы извлекал каждый набор изменений для рассматриваемого файла, а затем выполнял бы поиск по строке различий. Тогда это так же просто, как распечатать текущий номер ревизии:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...