Есть ли способ найти версию SVN, выполнив поиск текстовой строки, которая была удалена в файле? Я знаю точный текст, который нужно искать, и файл, в котором нужно искать, но существуют сотни исправлений.
найти версию svn по удаленному тексту
Ответы (5)
Основываясь на сценарии 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 дает мне и версию, где она добавлена, и где она удалена; Оставлю здесь, вдруг кому пригодится. В последней версии есть сообщение об ошибке, от которого я не знаю, как избавиться (мне еще нужно многому научиться :)), но номера версий верны.
grep "^r" | cut -d"r" -f2 | cut -d" " -f1
вы используете три процесса; Вместо этого я бы использовал что-то вроде sed -ne '/^r/ { s/^r//; s/ .*//; p }'
.
- person musiphil; 11.09.2013
tr -s " " | grep -v " -\ \- "
больше не актуален, так как вы мигрировали с svn blame
, где он использовался для фильтрации неизмененных строк. Таким образом, ваш скрипт также будет печатать неизмененные строки с заданным словом, которые достаточно близки к измененным строкам. Вам действительно следует искать строки, начинающиеся с -
или +
, т.е. фильтровать с grep "^[-+]"
.
- person musiphil; 12.09.2013
просто небольшой скрипт 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 — это ревизия, в которой были внесены изменения.
Мне нравится blameall.py.
Его вывод для файла содержит все существующие и удаленные строки, так что я могу видеть удаленные строки в окружающем контексте.
Сделал простую 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"
Сценарий можно настроить, но он делает то, что вам нужно. Имейте в виду, что поиск по множеству ревизий занимает много времени.
Если вы не можете или не хотите использовать скрипты:
svn log --diff [path_to_file] > log.txt
([путь_к_файлу] является необязательным, если вы его не укажете, он будет включать все файлы в текущей папке и подпапках)
Там вы можете найти все добавленные строки (они начинаются с +), все удаленные строки (они начинаются с -) и некоторые контекстные строки (они начинаются с пробела). Измененные строки будут отображаться со знаком + и повторяться со знаком -.
Вы можете обработать полученный файл любым приличным текстовым редактором (например, Notepad++), grep, скриптами или чем угодно.
ОБНОВИТЬ:
Если файл был удален и снова добавлен в какой-то момент истории, вы можете сделать следующее для поиска до этого момента:
- First find when the file was deleted:
- svn log -v [path-to-parent-folder] > logParent.txt
- найдите «D [путь к файлу]» в logParent.txt
- для найденной ревизии (назовем ее [удаленная-редакция]) вычтите 1: [предыдущая-удаленная-редакция] = [удаленная-редакция]-1
- svn log --diff [путь к файлу]@[предыдущая удаленная-редакция] > log.txt