2010-04-29 65 views
33

SVN版本有没有办法通过搜索得到的文件中删除文本字符串找到一个SVN版本?我知道要搜索的确切文本和要查找的文件,但有数百个修订。找到删除的文本

+0

您的意思是您所做的更改或日志消息中的文本?您可以使用svn日志URL /文件,以便获取修改文件的列表。使用svn blame -rRevision:修正URL /文件将打印出修订版本中已更改的行,并且将提供所需信息的grep(unix)... – khmarbaise 2010-04-29 08:59:12

+0

我的意思是实际的文件更改,而不是日志消息。 svn blame + grep已经足够好了,但是改变是删除了文本而不是添加它,所以它没有出现在那里。我已经通过澄清更新了这个问题。感谢khmarbaise。 – 2010-04-29 09:16:26

+1

如果添加一行或删除一行,svn blame将在两种情况下显示行。如果你使用我在我的回答中提出的方式(svn blame -r Rev:Rev URL/file)。 – khmarbaise 2010-04-29 09:25:56

回答

31

大厦khmarbaise的剧本,我想出了这个:

#!/bin/bash 
file="$1" 
REVISIONS=`svn log $file -q --stop-on-copy |grep "^r" | cut -d"r" -f2 | cut -d" " -f1` 
for rev in $REVISIONS; do 
    prevRev=$(($rev-1)) 
    difftext=`svn diff [email protected]$prevRev [email protected]$rev | tr -s " " | grep -v " -\ \- " | grep -e "$2"` 
    if [ -n "$difftext" ]; then 
     echo "$rev: $difftext" 
    fi 
done 

传递文件名和搜索字符串命令行:

xyz.sh "filename" "text to search" 

SVN差异给了我两种情况:它的转添加和删​​除的地方;如果对任何人都有用,我会把它留在这里。在最后一个版本中有一个错误消息,我不知道如何摆脱(我仍然有很多bash需要学习:)),但版本号是正确的。

+1

这对我来说很好,谢谢! – 2012-09-27 09:55:45

+0

这个脚本工作得很漂亮,即使是字符串/文本添加因为它在svn diff上工作。感谢您的脚本。 – 2013-01-30 11:40:03

+0

在'grep“^ r”| cut -d“r”-f2 | cut -d“”-f1'你正在使用三个进程;我会用'sed -ne'/^r/{s/^ r //; s /。* //;代替。 – musiphil 2013-09-11 19:21:15

9

只是过滤掉,在修改行...如果你改变的pom.xml文件中加入一个小bash脚本可以带有附加URL你有你需要什么...(如果你的系统是Unix系统一样)。将以下内容放入脚本文件(xyz.sh)中并在输出上执行过滤器。

#!/bin/bash 
REVISIONS=`svn log pom.xml -q|grep "^r" | cut -d"r" -f2 | cut -d" " -f1` 
for rev in $REVISIONS; do 
    svn blame -r$rev:$rev pom.xml | tr -s " " | grep -v " -\ \- " 
done 


xyz.sh | grep "Text you are searching for" 

打印输出结果将是这样的:

256 ...... 

256是其中的改变已作出的修订。

+0

这不打印删除的行,是吗? – musiphil 2013-09-11 22:23:40

+0

@musiphil正确。 – khmarbaise 2013-09-12 06:33:57

1

我喜欢blameall.py

它的输出文件包含所有现有的和删除的行,这样我可以看到周围的情况下删除线。

<?php 
$file = $argv[1]; 
$searchfor = $argv[2]; 

if (!$file) die('Please specify file name to search through as the first argument.'); 
if (!$searchfor) die('Please specify text to search for as the second argument.'); 

echo PHP_EOL .'Searching '. $file .' for: '. $searchfor . PHP_EOL . PHP_EOL; 

$cmd = 'svn log '. $file .' -q'; 
$output = array(); 
exec($cmd, $output); 

// Find all revisions 
$all_revisions = array(); 
foreach ($output as $line) { 
    if (preg_match("/^r(\\d+) /", $line, $match)) { 
     $all_revisions[] = $match[1]; 
    } 
} 

echo 'Checking '. count($all_revisions) .' revisions...'. PHP_EOL . PHP_EOL; 

// Get diff for each revision 
foreach ($all_revisions as $keykey => $rev) { 
    $prev_rev = $all_revisions[$keykey+1]; 

    $cmd = 'svn diff --old='. $file .'@'. $prev_rev .' --new='. $file .'@'. $rev; 
    $output = array(); 
    exec($cmd, $output); 

    // Check if string is present 
    $str = implode(PHP_EOL, $output); 
    if (strpos($str, $searchfor) !== false) { 
     echo 'Found in revision '. $prev_rev .' but removed from '. $rev .'.'. PHP_EOL; 
     break; 
    } else { 
     echo 'Not found in revision '. $rev .'.'. PHP_EOL; 
    } 
} 
echo 'Done.'. PHP_EOL; 

运行该脚本使用以下命令脚本:

1

取得了公认的答案的一个简单的PHP版本,在命令行上运行

php scriptname.php "filetosearchthrough.php" "text to search for"

该脚本可能要进行微调,但要做你所需要的。请记住,搜索许多修订版本需要很长时间。

0

如果您不能或不想使用脚本:

svn log --diff [path_to_file] > log.txt 

(在[文件路径]是可选的,如果不指定,这将包括所有文件当前文件夹和子文件夹)

在那里,你可以找到所有添加的行(他们首先+),全部去掉线(他们开始 - )和一些上下文行(他们开始用空格)。修改的行会出现与+并与重复 -

您可以处理与任何像样的文本编辑器(如记事本++)所生成的文件,grep的,脚本或者任何你喜欢的。