有没有办法通过搜索文件中删除的文本字符串来查找SVN修订版?我知道要搜索的确切文本以及要查看的文件,但有数百个修订。
答案 0 :(得分: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 --old=$file@$prevRev --new=$file@$rev | tr -s " " | grep -v " -\ \- " | grep -e "$2"`
if [ -n "$difftext" ]; then
echo "$rev: $difftext"
fi
done
在命令行上传递文件名和搜索字符串:
xyz.sh "filename" "text to search"
svn diff给了我添加它的地方和它被删除的地方;我会留在这里,以防它对任何人都有用。在上一次修订版中有一条错误消息,我不知道如何摆脱(我仍然有很多bash要学习:))但转数是正确的。
答案 1 :(得分:9)
只是一个小的bash脚本,它过滤掉更改的行...如果你将pom.xml更改为你的文件可能有补充的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是进行更改的修订版。
答案 2 :(得分:1)
我喜欢blameall.py。
文件的输出包含所有现有和已删除的行,以便我可以在周围的上下文中看到删除的行。
答案 3 :(得分:1)
在命令行上运行一个简单的PHP版本的接受答案:
<?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;
使用以下命令运行脚本脚本:
php scriptname.php "filetosearchthrough.php" "text to search for"
脚本可以进行微调,但可以满足您的需求。请记住,搜索许多修订需要很长时间。
答案 4 :(得分:0)
如果您不能或您不想使用脚本:
svn log --diff [path_to_file] > log.txt
([path_to_file]是可选的,如果你没有指定它,它将包括当前文件夹和子文件夹中的所有文件)
在那里你可以找到所有添加的行(它们以+开头),所有删除的行(它们以 - 开头)和一些上下文行(它们以空格开头)。修改后的行将显示为+,并使用 -
重复您可以使用任何体面的文本编辑器(例如Notepad ++),grep,脚本或任何您喜欢的内容处理生成的文件。
更新:
如果文件被删除并在历史记录的某个位置再次添加,您可以在该点之前进行以下搜索: