Проблема SVN: Какая последняя версия все еще содержала этот фрагмент кода? - PullRequest
10 голосов
/ 01 марта 2009

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

6 голосов
/ 01 марта 2009

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

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 

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

3 голосов
/ 17 июля 2009

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

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.

3 голосов
/ 01 марта 2009

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

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

2 голосов
/ 01 марта 2009

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

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

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

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

...