Проблема 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()"
Теперь вы можете просто искать журнал. Конец должен всегда идентифицировать по понятным для человека короткому пути, каковы изменения.