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


135

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

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

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


6
Apache Subversion 1.8 принимает --searchаргумент для svn logкоманды. Смотрите мой ответ на stackoverflow.com/a/17473516/761095
bahrep

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

Ответы:


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

1
Хорошая точка зрения. Графический интерфейс gitk очень хорошо выполняет такой поиск, и для доступа к репозиторию svn легко использовать инструменты git svn. К слову сказать, я полностью перешел на использование git с тех пор, как задал этот вопрос, поэтому принятие этого ответа может быть для меня немного специфичным.
Rjmunro

4
Имейте в виду, это может занять некоторое время в зависимости от размера вашего хранилища. Для меня это заняло больше часа.
user247702

20
Я отказался от этого решения, поскольку преобразование большого репозитория SVN в GIT часто невозможно или займет слишком много времени. Это все равно, что рекомендовать Java, когда возникает вопрос о конструкции языка C #.
ooxi

3
Возможно, вам потребуется установить дополнительный пакет для этой команды. На Ubuntu, вы хотите apt-get install git-svn.
nedned

5
Разве "svn log --verbose --diff | grep ..." не покупает ваши примерно те же функции без использования git?
Лит

41

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

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

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


7
Удобный, но не полнотекстовый поиск. Я придерживаюсь ответа git-svn :-)
rjmunro 04

4
Не то чтобы в данный момент svn репозитории на googlecode все еще работают на svn 1.6 ... см .: code.google.com/p/support/wiki/… ? Но обновление вашего клиента до 1,8 (и обновление svn любого извлеченного репо) позволит вам использовать svn log --search в репо ...
Марио Руджер

Рабочей копии требуются все обновления, но эта команда перечисляет все изменения, включая номер редакции, измененные файлы и комментарий. Как это не полнотекстовый?
Бернхард Доблер

24

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


Было бы здорово, если бы SvnQuery все еще поддерживали, но, к сожалению, он умер, а теперь он просто не работает вообще.
Дэн Аткинсон,

Я нашел работающего клона (?) На github.com/kalyptorisk/svnquery/releases
Филип Хелгер,

21

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

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


Мне пришлось удалить «r» из номеров ревизий с помощью: awk '{print substr ($ 1,2, length ($ 1))}' и удалить опцию grep «-q», чтобы на самом деле показать совпадения.
Хьюго

строки myDump.txt | grep "turtle fwd 10"
jedierikb

2
Вот почему мы принимаем git.
Ограниченное искупление

может потребоваться выполнить последний grep -i для игнорирования регистра и опустить -q, чтобы увидеть строку, которая соответствует
Belun

13

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

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

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

Редактировать:

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

svn diff -r0:HEAD | less

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


5
Это не полнотекстовый поиск, это поиск по логам и именам файлов.
Rjmunro

Если это так, то вам нужно использовать более выразительные журналы фиксации. Если вы хотите увидеть разницу между ревизиями, то это всего лишь другой шарик воска. И я лично не знаю, как это сделать.
Джек М.

> svn diff -r0: HEAD> log> less log - мой выбор для Windows. Спасибо
kingoleg

9

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


Я использую OpenGrok в течение нескольких месяцев, это круто.
Маурисио Схеффер,

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

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

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

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

Это не причудливый сценарий или что-то автоматизированное. Но это работает.


AFAICS, это будет искать сообщения фиксации, а не фактические различия.
rjmunro

Затем используйте svn log -v --diff [репозиторий]> somefile.log
JREN

6

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

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


1
Рыбий глаз довольно хорошо. Как вы говорите, не бесплатная, но лицензия коммиттера <= 10 стоит всего $ 10 / год.
Джейсон С

В настоящее время 5 пользователей стоят 10 долларов, НО только у 10 пользователей он достигает 1000 долларов!
Мауг говорит восстановить Монику


4

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

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

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


1
Работает только локально и займет много времени, если репозиторий большой.
bahrep 04

2

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



1

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


5
Это не полнотекстовый поиск, это поиск по логам и именам файлов.
rjmunro

Это то, что я обычно делаю, но я обнаружил, что с его помощью lessвы действительно можете увидеть версию, дату и т. Д., А не только строку в комментарии. Это обычно то, что я ищу в любом случае.
Джек М.

1

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

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

/ USR / местные / бен / 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 / местные / бен / svnrevisions

#!/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 }'

«А» для усилий! (просто используйте git :))
Ограниченное искупление


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.