如何在SubVersion存储库中搜索文件的所有修订版?

时间:2009-07-13 07:10:13

标签: svn

我想grep字符串文件的所有修订版。例如查找添加或删除功能的时间。

有一种“简单”的方法吗? (即单个bash命令行会很好。)通过检查修订和单独测试来进行手动二进制搜索似乎过于繁琐且容易出错。

如果我足够聪明,可以使用有用的描述提交更改,那么我可以使用以下内容grep来记录日志:

svn log myfile.c | grep my_func

虽然这不提供修订号,所以我怀疑还有更好的方法。

7 个答案:

答案 0 :(得分:34)

我写了一个脚本来做到这一点

典型用法:

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);
    }
}

答案 1 :(得分:7)

"annotate/blame" command并不能完全符合您的要求,但它可以提供帮助:

  

svn blame - 显示指定文件或网址的内嵌作者和修订信息。

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

所以,你应该能够找出谁添加了一个功能。至于找出谁删除了一个功能,不知道。

答案 2 :(得分:3)

使用Subversion 1.6服务器及其mod_dav_svn,您可以通过GET参数指定修订号:

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

因此,您可以在所有修订版中轻松wget您的文件,然后diff

来源:SVN 1.6 changelog

答案 3 :(得分:2)

这是一个搜索包含字符串的文件修订版的命令:

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

答案 4 :(得分:1)

你要做的第一件事就是很难。我通常建议使用svn diff或svn cat,但是(据我所知)没有办法让代码输出内联修订号。

关于第二个问题,如果您正在寻找特定用户,可以使用

svn log | grep -A 2 username

在每个匹配的行之后会给你两个额外的行(-A =“after”)。如果您没有很长的日志消息,则可以使用

svn log | grep -B 2 search_string

将类似地在每个匹配行(-B)之前打印两行。 (这应该足以为您提供修订版号。)我绝对肯定AWK有更好的方法可以根据日志消息给出修订号,但我很累,我想不到它现在。 :d

答案 5 :(得分:0)

据我所知,这不容易。我会编写一个小脚本来检索有问题的文件的每个变更集,然后通过diff来查找字符串。然后就像打印当前版本号一样简单:)

答案 6 :(得分:0)

您可以使用pySVN + python diff tools执行此操作,虽然它不是bash,但如果您更经常地使用此功能,也许值得考虑。它是wget solution的一个版本,但是如果你构建它就会有一个更好的界面:)