34

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

4

5 回答 5

32

基于 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 给了我添加和删除的 rev;我会把它留在这里,以防它对任何人有用。上一个版本中有一条错误消息,我不知道如何摆脱(我还有很多 bash 需要学习 :)),但版本号是正确的。

于 2010-04-30T07:07:15.810 回答
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 是进行更改的版本。

于 2010-04-29T09:06:54.627 回答
1

我喜欢blameall.py

它的文件输出包含所有现有和已删除的行,以便我可以在周围的上下文中看到已删除的行。

于 2013-12-12T12:57:44.353 回答
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"

该脚本可以进行微调,但可以满足您的需要。请记住,搜索许多修订版需要很长时间。

于 2016-03-10T13:19:50.393 回答
1

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

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

([path_to_file] 是可选的,如果不指定,它将包括当前文件夹和子文件夹中的所有文件)

在那里您可以找到所有添加的行(它们以 + 开头)、所有删除的行(它们以 - 开头)和一些上下文行(它们以空格开头)。修改后的行将与 + 一起出现并与 - 重复

您可以使用任何体面的文本编辑器(例如 Notepad++)、grep、脚本或任何您喜欢的东西来处理生成的文件。

更新:

如果文件在历史的某个时间点被删除并再次添加,您可以在该点之前执行以下搜索:

  • 首先查找文件被删除的时间:
    • svn log -v [path-to-parent-folder] > logParent.txt
    • 在 logParent.txt 中搜索“D [path-to-file]”
    • 对于找到的每个修订版(我们称之为 [deleted-revision])减去 1:[prev-deleted-revision] = [deleted-revision]-1
    • svn log --diff [path-to-file]@[prev-deleted-revision] > log.txt
于 2018-02-21T10:27:59.887 回答