Проблема SVN: какова последняя версия, которая все еще содержала этот фрагмент кода?

Хорошая практика - удалить старый код, а не просто комментировать его. Часто утверждается, что старые части кода всегда можно найти снова в старой версии репозитория SVN, если это необходимо.

Но практически, это не так просто, не так ли? Если старый код находится в какой-то неизвестной старой версии SVN, это может быть довольно сложно найти.

Я точно в этой ситуации прямо сейчас: там есть функция, которая мне больше не нужна, и я должен ее выбросить, поскольку она в SVN, но я стесняюсь, потому что мне может понадобиться это снова, и я боюсь, что в хранилище будет трудно найти.

Конечно, всегда можно сделать сообщение фиксации, говоря "удаленная функция myFunction", но иногда вы не можете отметить каждое небольшое удаление кода в сообщении фиксации, и также может быть утомительным просмотр всех сообщений фиксации найти что-то еще.

Автоматический инструмент будет лучше, что-то вроде

svn find "void myFunction\(" my-file.cc

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

РЕДАКТИРОВАТЬ: Имеют ли другие системы управления версиями? Git может быть? (Это было бы поводом для переключения, я бы сказал.)

ОБНОВЛЕНИЕ: Таким образом, нет реального ответа, кроме крошечного хрупкого shell script, который я нашел более или менее случайно (см. мой ответ ниже). Я думаю, это действительно позор для SVN. Поиск чего-то в более ранних версиях должен быть одной из центральных функций контроля версий. У кого-нибудь есть дополнительная информация?

Ответ 1

Я googled еще и нашел следующее script (см. здесь). Я проверил его ненадолго и, похоже, работает нормально:

rev_grep.sh
=====================
#!/bin/ksh

URL=$1
REGEX=$2

LAST_REV="n/a"

svn log -q $URL | perl -ne 'print "$1\n" if /^r(\d+)/' |
while read r
do
    ##svn cat -r $r $URL | grep "$REGEX" > /dev/null
    BUFFER=`svn cat -r $r $URL | grep "$REGEX"`
    RET=$?
    if [ $RET -eq 0 ]
    then
        echo "Match in revision: $r. Removed in $LAST_REV."
        echo $BUFFER

        exit 0

    elif [ $RET -ne 1 ]
    then
        ## grep hit an error
        exit 2
    fi

    LAST_REV=$r
done
exit 1 

Единственная проблема заключается в том, что если вашему репозиторию требуется пароль, вам придется вводить его много раз.

Ответ 2

Как оказалось, Git имеет именно эту функцию. Вы можете использовать Git для клонирования вашего репозитория Subversion (используя git svn), а затем используйте инструменты Git (в частности gitk упрощает поиск любого текста, добавленного или удаляемого в любом месте истории хранилища.

Чтобы найти последнюю версию, которая по-прежнему содержала определенный текст, вы можете использовать git bisect для эффективного поиска истории изменений, где какое-то условие изменилось.

Ответ 3

Это похоже на оболочку script из ответа dehman, но написано на python. Таким образом вам нужен только python для запуска script и, возможно, более дружелюбный к различным операционным системам.

import os
import re

filename = 'CustomROIMarker.cpp'
stringToFind = 'ImageMarker::outOfDataSet;'

log = os.popen('svn log ' + filename).read()
versions = re.findall('r\d+',log)
for v in versions:
    numVer =  int(v.strip('r'))
    cmdString = 'svn cat -r ' + str(numVer) + ' ' + filename
    contents = os.popen(cmdString).read()
    if re.search(stringToFind,contents) != None:
        print "Present in " + str(numVer)
    else:
        print "Not Present in " + str(numVer)

Вам нужно будет отредактировать переменные filename и stringToFind.

Ответ 4

Я думаю, получится пара отрицательных голосов за это...

Есть несколько вещей, которые легче решать на нетехнических основаниях. Напишите в сообщении журнала, что вы удаляете эту функцию. Поиск абзацев будет просто анализировать журнал svn:

$ svn commit file.c -m "Removal of void deprecated_function()"

Теперь вы можете просто искать журнал. Конец должен всегда идентифицировать по понятным для человека короткому пути, каковы изменения.