2009-07-13 94 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 
相關問題