Есть ли способ найти версию SVN путем поиска текстовой строки, которая была удалена в файле? Я знаю точный текст для поиска и какой файл искать, но есть сотни исправлений.
Найти svn ревизию удаленным текстом
Ответ 1
Основываясь на khmarbaise script, я придумал это:
#!/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 diff дает мне как rev, где он добавлен, так и где он удаляется; Я оставлю его здесь, если это будет полезно для всех. На последней ревизии появляется сообщение об ошибке, о котором я не знаю, как избавиться (я все еще получил много bash, чтобы узнать:)), но числа оборотов верны.
Ответ 2
немного bash script, который отфильтровывает измененные строки... Если вы измените pom.xml в свой файл, можете с дополнительным URL-адресом у вас есть то, что вам нужно... (Если вы используете Unix-систему). Поместите следующее в файл script (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 - это ревизия, в которой было сделано изменение.
Ответ 3
Мне нравится blameall.py.
Вывод для файла содержит все существующие и удаленные строки, чтобы я мог видеть удаленные строки в окружающем контексте.
Ответ 4
Сделана простая версия 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;
Запустите script script с помощью следующей команды:
PHP скриптname.php "filetosearchthrough.php" "text to search for"
script можно было бы точно настроить, но делать то, что вам нужно. Имейте в виду, что для просмотра многих версий требуется много времени.