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

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

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

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

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

bahrep 04.07.2013 19:06

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

zb226 15.04.2016 13:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
139
2
70 306
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

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

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

Я использую OpenGrok несколько месяцев, он потрясающий.

Mauricio Scheffer 29.09.2008 20:16

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

svn log --verbose | less

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

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

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

svn diff -r0:HEAD | less

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

Это не полнотекстовый поиск, это поиск в журналах и именах файлов.

rjmunro 07.09.2008 18:09

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

Jack M. 23.03.2009 21:11

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

kingoleg 11.04.2016 17:57

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

Это не полнотекстовый поиск, это поиск в журналах и именах файлов.

rjmunro 07.09.2008 18:07

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

Jack M. 23.03.2009 21:10

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

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

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

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

Dan Atkinson 06.08.2015 20:17

Я нашел рабочий клон (?) В github.com/kalyptorisk/svnquery/releases

Philip Helger 09.04.2020 21:08

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

#!/bin/bash
for REV in `svn log  | grep ^r[0-9] | awk '{print }'`; do 
  svn cat  -r $REV | grep -q 
  if [ $? -eq 0 ]; then 
    echo "$REV"
  fi 
done

Если вы действительно хотите найти все, используйте команду svnadmin dump и выполните поиск с помощью grep.

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

Hugo 06.12.2010 16:57

строки myDump.txt | grep "черепаха fwd 10"

jedierikb 14.07.2012 06:31

Вот почему мы принимаем git.

lmat - Reinstate Monica 17.10.2013 23:27

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

Belun 22.07.2016 14:46

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

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

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

Jason S 30.11.2010 21:47

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

Mawg says reinstate Monica 09.06.2016 13:19

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

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

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

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

bahrep 04.07.2013 19:13
Ответ принят как подходящий

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

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

rjmunro 29.09.2010 18:08

Если вы хотите просто искать сообщения фиксации, используйте git log --grep regex.

lmat - Reinstate Monica 17.10.2013 23:26

Имейте в виду, что это может занять некоторое время в зависимости от размера вашего репозитория. У меня на это ушло больше часа.

user247702 07.08.2015 19:31

Неужели это перебирает всю историю?

Jonny 24.11.2015 12:08

@rjmunro: простой git grep < some regex >, как указано в ответе, вообще не выполняет поиск в истории. Таким образом, это вообще не отвечает на ваш вопрос.

zb226 03.03.2016 12:33

@ zb226 Преобразование в git и поиск с помощью gitk gui у меня сработали. Я предположил, что этот ответ был эквивалентным способом сделать это из командной строки. На самом деле похоже, что эквивалентная команда - git log -S (из этот ответ), но git log -G может быть даже лучше. Редактирую этот ответ.

rjmunro 03.03.2016 14:26

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

ooxi 11.03.2016 10:31

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

nedned 24.03.2016 02:53

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

lyte 06.07.2016 08:33

@lyte Это примерно тот же функционал. Это очень хорошо, если вы работаете только с svn. Мне кажется смешной идея использовать git для поиска коммитов. Проблема начинается, когда вы хотите увидеть больше, чем просто строку, содержащую искомый термин. grep может напечатать несколько строк до и после обнаружения, но вы никогда не знаете, сколько строк вам нужно (чтобы найти номер версии вверху или весь комментарий внизу). Вывод трудно читать.

Bernhard Döbler 23.08.2017 13:42

Это поиск с помощью git, а не поиск с помощью SVN в соответствии с вопросом. Это эквивалентно предоставлению скрипта Python для ответа на вопрос C - он работает, но не отвечает на исходный вопрос.

Tydaeus 19.03.2019 18:58

Я написал это как сценарий 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  }'`; 

                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/,"",); print   }'

«А» за усилия! (просто используйте git :))

lmat - Reinstate Monica 17.10.2013 23:30

Наткнулся на этот bash скрипт, но не пробовал.

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

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

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

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

rjmunro 04.07.2013 23:10

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

Mario Ruggier 15.08.2014 15:05

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

Bernhard Döbler 23.08.2017 13:50

svn log -v [repository] > somefile.log

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

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

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

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

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

rjmunro 14.10.2015 19:21

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

JREN 15.10.2015 09:06

или просто пропустите grep, как в ответе zednight

giles 08.10.2020 21:00

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

добавьте --diff к этому, чтобы получить текстовый поиск изменений

giles 08.10.2020 20:59

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

svn blame

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

Другие вопросы по теме