Поиск истории подрывной деятельности (полный текст)

Есть ли способ выполнить полный текстовый поиск репозитория подрывной деятельности, включая всю историю?

Например, я написал функцию, которую я использовал где-то, но тогда она не нужна, поэтому я svn rm'd файлы, но теперь мне нужно найти ее снова, чтобы использовать ее для чего-то другого. В журнале svn, вероятно, написано что-то вроде "удаленных неиспользуемых материалов", и там загрузок таких проверок.

Изменить 2016-04-15: Обратите внимание, что то, что здесь задается термином "полнотекстовый поиск", - это поиск фактических различий истории фиксации, а не имен файлов и/или совершать сообщения. Я указываю это, потому что авторская фраза выше не очень хорошо отражает это, поскольку в его примере он может также искать только имя файла и/или сообщение фиксации. Отсюда много ответов и комментариев svn log.

Ответ 1

git svn clone <svn url>
git log -G<some regex>

Ответ 2

svn log в Apache Subversion 1.8 поддерживает новый --search вариант. Таким образом, вы можете искать сообщения журнала истории репозитория Subversion, не используя 3-х сторонние инструменты и скрипты.

svn log --search выполняет поиск в тексте автора, даты, сообщения журнала и списке измененных путей.

Смотрите SVNBook | svn log ссылка в командной строке.

Ответ 3

Если вы используете Windows, посмотрите SvnQuery. Он поддерживает полный текстовый индекс локальных или удаленных репозиториев. Каждый документ, когда-либо прикрепленный к репозиторию, индексируется. Вы можете делать Google-подобные запросы из простого веб-интерфейса.

Ответ 4

Я использую небольшой shellscript, но это работает только для одного файла. Вы можете использовать это, чтобы найти больше файлов.

#!/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.

Ответ 5

Лучший способ, который я нашел для этого, - это меньше:

svn log --verbose | меньше

Как только вы выйдете с выходом, вы можете нажать / для поиска, например VIM.

Edit:

По словам автора, он хочет искать больше, чем просто сообщения и имена файлов. В этом случае вам понадобится гетто - взломайте его вместе с чем-то вроде:

svn diff -r0:HEAD | less

Вы также можете заменить grep или что-то еще, чтобы выполнить поиск. Если вы хотите использовать это в поддиректории репозитория, вам нужно будет использовать svn log для определения первой версии, в которой существует этот каталог, и использовать эту ревизию вместо 0.

Ответ 6

Я искал нечто похожее. Лучшее, что я придумал, это OpenGrok. Я еще не пытался его реализовать, но звучит многообещающе.

Ответ 7

Не будучи свободным, вы можете взглянуть на Fisheye от Atlassian, тех же людей, которые принесут вам JIRA. Он выполняет полнотекстовый поиск по SVN со многими другими полезными функциями.

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

Ответ 8

svn log -v [repository] > somefile.log

для diff вы можете использовать опцию --diff

svn log -v --diff [repository] > somefile.log

затем используйте vim или nano или что-то, что вам нравится, и выполните поиск того, что вы ищете. Вы найдете его довольно быстро.

Это не фантазия script или что-то автоматическое. Но он работает.

Ответ 10

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

svnadmin dump <repo location> |grep -i <search term>

выполнил эту работу для меня. Вернул ревизию первого вхождения и процитировал строку, которую я искал.

Ответ 11

У меня нет опыта с этим, но SupoSE (с открытым исходным кодом, написанный на Java) - это инструмент, предназначенный для сделайте именно это.

Ответ 12

svn log -l<commit limit> | grep -C<5 or more lines> <search message>

Ответ 13

Я написал это как cygwin bash script для решения этой проблемы.

Однако для этого требуется, чтобы поисковый запрос находился в файле файловой системы. Для всех файлов, соответствующих файловой системе grep, затем выполняется grep всех svn diff для этого файла. Не совершенен, но должен быть достаточно хорош для большей части использования. Надеюсь, это поможет.

/USR/локальные/бен/svngrep

#!/bin/bash
# Usage: svngrep $regex @grep_args

regex="[email protected]"
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/локальные/бен/svnrevisions

#!/bin/sh
# Usage:  svnrevisions $file
# Output: list of fully numeric svn revisions (without the r), one per line

file="[email protected]"
    svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print  $1 }'

Ответ 14

Я обычно делаю то, что Jack M говорит (используйте svn log --verbose), но я трачу на grep, а не меньше.

Ответ 15

Если вы пытаетесь определить, какая ревизия отвечает за определенную строку кода, вы, вероятно, ищете:

svn blame

Кредит: оригинальный ответ

Ответ 16

Я столкнулся с этим bash script, но я его не пробовал.