найти SVN ревизию по удаленному тексту - PullRequest
33 голосов
/ 29 апреля 2010

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

Ответы [ 5 ]

31 голосов
/ 30 апреля 2010

Основываясь на сценарии Хмарбайса, я придумал это:

#!/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 :)), но номера оборотов верны.

9 голосов
/ 29 апреля 2010

просто небольшой скрипт 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 - это ревизия, в которую было внесено изменение.

1 голос
/ 10 марта 2016

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

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

1 голос
/ 12 декабря 2013

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

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

0 голосов
/ 21 февраля 2018

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

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

([path_to_file] является необязательным, если вы его не укажете, он будет включать все файлы в текущей папке и подпапках)

Там вы можете найти все добавленные строки (они начинаются с +), все удаленные строки (они начинаются с -) и некоторые контекстные строки (они начинаются с пробела). Измененные строки появятся с + и повторятся с -

Вы можете обработать полученный файл с помощью любого приличного текстового редактора (например, Notepad ++), grep, скриптов или чего угодно.

UPDATE:

Если файл был удален и снова добавлен в какой-то момент истории, вы можете выполнить следующие действия для поиска до этой точки:

  • Сначала найдите, когда файл был удален:
    • svn log -v [путь к родительской папке]> logParent.txt
    • поиск "D [путь к файлу]" в logParent.txt
    • для найденной ревизии (назовем ее [удаленная-ревизия]) вычесть 1: [предыдущая-удаленная-ревизия] = [удаленная-ревизия] -1
    • svn log --diff [путь к файлу] @ [предыдущая удаленная ревизия]> log.txt
...