代码之家  ›  专栏  ›  技术社区  ›  Tom Gruff

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

svn
  •  32
  • Tom Gruff  · 技术社区  · 17 年前

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

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

    如果我足够聪明,可以用有用的描述提交更改,那么我可以 格雷普 日志内容如下:

    svn log myfile.c | grep my_func
    

    不过,这并没有提供修订号,所以我怀疑还有更好的方法可以做到这一点。

    7 回复  |  直到 10 年前
        1
  •  34
  •   Paul Dixon    17 年前

    我写了一个剧本

    典型用法:

    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);
        }
    }
    
        2
  •  7
  •   Thilo    17 年前

    这个 "annotate/blame" command 并不完全满足您的需求,但它可以帮助您:

    SVN责备“显示指定文件或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
  •  3
  •   guerda    17 年前

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

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

    所以你可以很容易地 wget 所有修订版中的文件,然后 diff 他们。

    来源: SVN 1.6 changelog

        4
  •  2
  •   the brx in the walls    10 年前

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

    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
    
        5
  •  1
  •   Zachary Murray    17 年前

    你想做的第一件事是困难的。我通常建议使用svn diff或svn cat,但是(据我所知)没有办法使修订号与代码输出保持一致。

    在第二个问题上,如果要查找特定用户,可以使用

    svn log | grep -A 2 username
    

    这将在每一条匹配的行之后为您提供两条额外的行(-a=“after”)。如果日志消息不太长,可以使用

    svn log | grep -B 2 search_string
    

    它同样会在每个匹配行之前打印两行。(希望能给你足够的修订号。)我确信有一种更好的方法可以让awk根据日志信息给你修订号,但是我累了,现在我想不起来了。:d

        6
  •  0
  •   bluebrother    17 年前

    据我所知,这不容易实现。我将编写一个小脚本,它为相关文件检索每个变更集,然后对字符串的diff进行grep。那么它就和打印当前版本号一样简单了:)

        7
  •  0
  •   Community Mohan Dere    9 年前

    你可以用 pySVN +蟒蛇 diff tools 要做到这一点,虽然它不是bash,但如果您更经常地使用这个函数,可能值得考虑。它是 wget solution 但是会有一个更好的界面,如果你构建它的话:)