Вопрос

Есть ли способ выполнить полнотекстовый поиск в репозитории 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 выполняет поиск по автору, дате, тексту сообщения журнала и списку измененных путей.

Видишь SVNBook | svn log ссылка на командную строку.

Если вы используете 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 со многими другими полезными функциями.

http://www.atlassian.com/software/fisheye/

Я искал то же самое и нашел это:

http://svn-search.sourceforge.net/

Я только что столкнулся с этой проблемой и

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, но я этого еще не пробовал.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top