2008-09-04 3 views
115

Есть ли способ выполнить полный текстовый поиск в хранилище подрывной деятельности, включая всю историю?Поиск истории subversion (полный текст)

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

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

+5

Apache Subversion 1,8 принимает `--search` для команды` svn log`. См. Мой ответ на http://stackoverflow.com/a/17473516/761095 – bahrep 2013-07-04 15:06:13

+1

`svn log --search` не выполняет полнотекстовый поиск по требованию @rjmunro, но выполняет поиск только автора, даты, сообщения журнала и списка измененные пути. – zb226 2016-04-15 10:25:54

ответ

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

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

9

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

+0

Я использую OpenGrok в течение нескольких месяцев, он потрясает. – 2008-09-29 16:16:38

11

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

Svn | но не более

После того как вы получаете меньше выходного сигнала, вы можете нажать / для поиска, например, VIM.

Edit:

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

svn diff -r0:HEAD | less 

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

+4

Это не полный поиск текста, он ищет журналы и имена файлов. – rjmunro 2008-09-07 14:09:22

+0

Если это так, вам нужно использовать более выразительные журналы фиксации. Если вы хотите разделить разницу между ревизиями, то есть весь другой воск. И я лично не знаю, как это сделать. – 2009-03-23 18:11:56

+0

> svn diff -r0: HEAD> log > less log - мой выбор на окнах. Спасибо – kingoleg 2016-04-11 14:57:37

0

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

+5

Это не полный поиск текста, он ищет журналы и имена файлов. – rjmunro 2008-09-07 14:07:22

+0

Это то, что я обычно делаю, но я обнаружил, что с `less` вы можете увидеть ревизию, дату и т. Д., А не только строку в комментарии. Это, как правило, то, что я ищу в любом случае. – 2009-03-23 18:10:07

22

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

+0

Было бы здорово, если бы SvnQuery все еще поддерживался, но, к сожалению, он умер, и теперь он просто не работает вообще. – 2015-08-06 17:17:01

21

Я использую небольшой 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 через это.

+2

+1 для указателя дампа администратора. – akuhn 2010-01-26 10:44:08

+0

Мне пришлось удалить «r» из номеров ревизий с помощью: awk '{print substr ($ 1,2, length ($ 1))}' и удалить параметр grep -q, чтобы фактически показать совпадения. – Hugo 2010-12-06 13:57:22

+0

строки myDump.txt | grep "turtle fwd 10" – jedierikb 2012-07-14 02:31:57

6

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

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

2

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

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

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

1

Я написал это как Cygwin Баш скрипт, чтобы решить эту проблему.

Однако для этого требуется, чтобы поисковый запрос находился в файле файловой системы. Для всех файлов, соответствующих файловой системе 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 }' 
32

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

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

См. SVNBook | svn log command-line reference.

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

для дифф вы можете использовать --diff вариант

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

затем использовать Vim или нано или все, что вы, как с помощью, и сделать поиск для того, что вы ищете. Вы найдете это довольно быстро.

Это не фантастический сценарий или что-то автоматическое. Но это работает.

-1

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

svn blame 

Кредит: original answer

Смежные вопросы