найти версию svn по удаленному тексту

Есть ли способ найти версию SVN, выполнив поиск текстовой строки, которая была удалена в файле? Я знаю точный текст, который нужно искать, и файл, в котором нужно искать, но существуют сотни исправлений.


person martin_ljchan    schedule 29.04.2010    source источник
comment
Вы имеете в виду изменения, которые вы сделали, или текст, который находится в сообщении журнала? Вы можете использовать URL-адрес/файл журнала svn, чтобы получить список ревизий, в которых этот файл был изменен. Использование svn fault -rRevision:Revision URL/file распечатает строку, которая была изменена в версии, и grep (unix), которая даст необходимую информацию...   -  person khmarbaise    schedule 29.04.2010
comment
Я имел в виду фактические изменения файла, а не сообщения журнала. svn fault + grep был почти достаточно хорош, но изменение заключалось в удалении текста, а не в его добавлении, поэтому он там не отображался. Я обновил вопрос с разъяснениями; спасибо хмарбайсе.   -  person martin_ljchan    schedule 29.04.2010
comment
svn fault будет отображать строки в обоих случаях, если вы добавите строку или удалите строку. Если вы используете способ, который я предложил в своем ответе (svn fault -r Rev:Rev URL/file).   -  person khmarbaise    schedule 29.04.2010
comment
На самом деле, это показывает оборот при добавлении строки, но не оборот при ее удалении (вина не генерирует вывод для удаленной строки). Ваше предложение все же помогло - оказывается, текст, который я искал, вообще никогда не добавлялся в файл. упс :)   -  person martin_ljchan    schedule 30.04.2010


Ответы (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 дает мне и версию, где она добавлена, и где она удалена; Оставлю здесь, вдруг кому пригодится. В последней версии есть сообщение об ошибке, от которого я не знаю, как избавиться (мне еще нужно многому научиться :)), но номера версий верны.

person martin_ljchan    schedule 30.04.2010
comment
Этот скрипт прекрасно работает даже для добавленной строки/текста, потому что он работает на svn diff. Спасибо за сценарий. - person Jeevan Pingali; 30.01.2013
comment
В grep "^r" | cut -d"r" -f2 | cut -d" " -f1 вы используете три процесса; Вместо этого я бы использовал что-то вроде sed -ne '/^r/ { s/^r//; s/ .*//; p }'. - person musiphil; 11.09.2013
comment
Я предполагаю, что 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 — это ревизия, в которой были внесены изменения.

person khmarbaise    schedule 29.04.2010
comment
Это не печатает удаленные строки, не так ли? - person musiphil; 12.09.2013

Мне нравится blameall.py.

Его вывод для файла содержит все существующие и удаленные строки, так что я могу видеть удаленные строки в окружающем контексте.

person Ves    schedule 12.12.2013

Сделал простую 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"

Сценарий можно настроить, но он делает то, что вам нужно. Имейте в виду, что поиск по множеству ревизий занимает много времени.

person TheStoryCoder    schedule 10.03.2016

Если вы не можете или не хотите использовать скрипты:

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
person user2518618    schedule 21.02.2018