2009-07-13 86 views
32

我想grep字符串文件的所有修订版本。例如找到何时添加或删除功能。如何在SubVersion存储库中搜索文件的所有修订版本?

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

如果我足够聪明,犯了一个有用的描述的变化,然后我可以grep日志的东西,如:

svn log myfile.c | grep my_func 

这并不提供一个版本号的,所以我怀疑有一个更好的也可以这样做。

回答

31

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

典型用法:

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

从当前版本开始,然后只在差异中刷新如何? – Jann 2010-01-19 11:16:28

1

你想要做的第一件事情会很困难。我通常会建议使用svn diff或svn cat,但是(据我所知)没有办法使代码输出与内联版本号一致。

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

svn log | grep -A 2 username 

,这将给你每个匹配的行后两个额外的线(-A =“后”)。如果你没有很长的日志信息,你可以使用

svn log | grep -B 2 search_string 

它会在(-B)每条匹配行之前打印两行。 (这应该足以让您知道修订版号了。)我绝对确信AWK有更好的方法来根据日志消息给出修订号,但是我很累,而且我无法想象它现在。 :d

7

"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. 

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

0

据我所知,这是不容易的。我会写一个小脚本来检索有问题的文件的每个变更集,然后grep通过字符串的diff。然后,它可以指定通过GET参数的版本号是作为打印当前版本号:)

3

在Subversion 1.6服务器及其mod_dav_svn简单:

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

让您可以轻松wget您的文件所有的修改,然后diff他们。

来源:SVN 1.6 changelog

0

您可以使用pySVN +蟒蛇diff tools要做到这一点,而这是不是bash中,它也许值得考虑,如果你使用这个功能上更经常地。这是wget solution的一个版本,但将有一个更好的接口,那么,如果你建立了:)

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 [email protected]$rev 
done 
相关问题