Поиск по истории subversion (полный текст)
-
09-06-2019 - |
Вопрос
Есть ли способ выполнить полнотекстовый поиск в репозитории subversion, включая всю историю?
Например, я написал функцию, которую где-то использовал, но тогда она была не нужна, поэтому я загрузил файлы в svn rm, но теперь мне нужно найти ее снова, чтобы использовать для чего-то другого.В журнале svn, вероятно, написано что-то вроде "удалены неиспользуемые файлы", и есть множество подобных проверок.
Редактировать 2016-04-15: Пожалуйста, обратите внимание, что термин "полнотекстовый поиск" здесь подразумевает следующее: ищите фактические различия в истории фиксаций, а не имена файлов и / или сообщения о фиксации.Я указываю на это, потому что приведенная выше формулировка автора не очень хорошо отражает это - поскольку в его примере он с таким же успехом мог бы искать только имя файла и / или сообщение о фиксации.Отсюда большая часть svn log
ответы и комментарии.
Решение
git svn clone <svn url>
git log -G<some regex>
Другие советы
svn log
в Apache Subversion 1.8 поддерживается новый --search
вариант.Таким образом, вы можете выполнять поиск сообщений журнала истории репозитория Subversion, не используя сторонние инструменты и скрипты.
svn log --search
выполняет поиск по автору, дате, тексту сообщения журнала и списку измененных путей.
Если вы используете Windows, взгляните на SvnQuery (SVN-запрос).Он поддерживает полнотекстовый индекс локальных или удаленных репозиториев.Каждый документ, когда-либо сохраненный в репозитории, индексируется.Вы можете выполнять запросы, похожие на Google, с помощью простого веб-интерфейса.
Я использую небольшой shellscript, но это работает только для одного файла.Конечно, вы можете объединить это с функцией find, чтобы включить больше файлов.
#!/bin/bash
for REV in `svn log $1 | grep ^r[0-9] | awk '{print $1}'`; do
svn cat $1 -r $REV | grep -q $2
if [ $? -eq 0 ]; then
echo "$REV"
fi
done
Если вы действительно хотите выполнить поиск по всему, используйте svnadmin dump
выполните команду и grep через это.
Лучший способ, который я нашел для этого, - использовать меньше:
svn log - подробный | меньше
Как только less выдаст результат, вы можете нажать /
для поиска, как в VIM.
Редактировать:
По словам автора, он хочет искать нечто большее, чем просто сообщения и имена файлов.В этом случае вам потребуется взломать ghetto вместе с чем-то вроде:
svn diff -r0:HEAD | less
Вы также можете заменить grep
или что-то еще, чтобы заняться твоими поисками.Если вы хотите использовать это в подкаталоге репозитория, вам нужно будет использовать svn log
чтобы определить первую редакцию, в которой существовал этот каталог, и использовать эту редакцию вместо 0
.
Я давно искал что-то подобное.Лучшее, что я придумал, это Открытый Грок.Я еще не пробовал это реализовать, но звучит многообещающе.
svn log -v [repository] > somefile.log
для diff вы можете использовать --diff
вариант
svn log -v --diff [repository] > somefile.log
затем используйте vim, nano или что-то еще, что вам нравится использовать, и выполните поиск того, что вы ищете.Вы найдете это довольно быстро.
Это не навороченный скрипт или что-то автоматизированное.Но это работает.
Хотя это не бесплатно, вы можете взглянуть на Fisheye от Atlassian, тех же людей, которые привезли вам JIRA.Он выполняет полнотекстовый поиск по SVN со многими другими полезными функциями.
Я искал то же самое и нашел это:
Я только что столкнулся с этой проблемой и
svnadmin dump <repo location> |grep -i <search term>
сделал эту работу за меня.Вернул версию первого вхождения и процитировал строку, которую я искал.
У меня нет никакого опыта в этом, но Полагать (с открытым исходным кодом, написанный на Java) - это инструмент, предназначенный именно для этого.
svn log -l<commit limit> | grep -C<5 or more lines> <search message>
Я написал это как скрипт cygwin bash, чтобы решить эту проблему.
Однако для этого требуется, чтобы поисковый запрос в данный момент находился в файле файловой системы.Для всех файлов, которые соответствуют grep файловой системы, затем выполняется grep всех различий svn для этого файла.Не идеально, но должно быть достаточно хорошим для большинства применений.Надеюсь, это поможет.
/usr/локальный/bin/svngrep
#!/bin/bash
# Usage: svngrep $regex @grep_args
regex="$@"
pattern=`echo $regex | perl -p -e 's/--?\S+//g; s/^\\s+//;'` # strip --args
if [[ ! $regex ]]; then
echo "Usage: svngrep \$regex @grep_args"
else
for file in `grep -irl --no-messages --exclude=\*.tmp --exclude=\.svn $regex ./`; do
revs="`svnrevisions $file`";
for rev in $revs; do
diff=`svn diff $file -r$[rev-1]:$rev \
--diff-cmd /usr/bin/diff -x "-Ew -U5 --strip-trailing-cr" 2> /dev/null`
context=`echo "$diff" \
| grep -i --color=none -U5 "^\(+\|-\).*$pattern" \
| grep -i --color=always -U5 $pattern \
| grep -v '^+++\|^---\|^===\|^Index: ' \
`
if [[ $context ]]; then
info=`echo "$diff" | grep '^+++\|^---'`
log=`svn log $file -r$rev`
#author=`svn info -r$rev | awk '/Last Changed Author:/ { print $4 }'`;
echo "========================================================================"
echo "========================================================================"
echo "$log"
echo "$info"
echo "$context"
echo
fi;
done;
done;
fi
/usr/local/bin/svnревизии
#!/bin/sh
# Usage: svnrevisions $file
# Output: list of fully numeric svn revisions (without the r), one per line
file="$@"
svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print $1 }'
Обычно я делаю то, что Джек М говорит (используйте svn log --подробный), но я передаю в grep вместо того, чтобы меньше.
В случае, если вы пытаетесь определить, какая редакция отвечает за конкретную строку кода, вы, вероятно, ищете:
svn blame
Кредит: оригинальный ответ
Я наткнулся на это скрипт bash, но я этого еще не пробовал.