Пошук історії субверсії (повний текст)


135

Чи існує спосіб повнотекстового пошуку сховища субверсії, включаючи всю історію?

Наприклад, я написав функцію, яку я десь використовував, але тоді вона була не потрібна, тому я 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 дуже добре виконує цей вид пошуку, і легко використовувати інструменти git svn для доступу до сховища svn. Зі слів, я з часу, коли я задав це питання, повністю перейшов до використання git, тому прийняття цієї відповіді може бути для мене трохи специфічним.
rjmunro

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

20
Я прихилився до цього рішення, оскільки перетворення великого сховища SVN в GIT часто не представляється можливим або займе багато часу. Це як рекомендувати Java, якщо у вас є питання щодо мовної конструкції C #.
ooxi

3
Можливо, вам доведеться встановити додатковий пакет для цієї команди. На Ubuntu ви хочете apt-get install git-svn.
недільний

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

4
Не те, що наразі svn repos на googlecode все ще працює на svn 1.6 ... див .: code.google.com/p/support/wiki/… ? Але оновлення вашого клієнта до 1,8 (і оновлення svn будь-якої перевіреної репо) дозволить вам використовувати svn log
шукати

Робочій копії потрібні всі оновлення, але ця команда перераховує всю зміну, включаючи номер редакції, змінені файли та коментарі. Як це не повнотекстовий?
Бернхард Дьоблер

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командою та перегляньте це.


Мені довелося видалити "r" з номерів версій за допомогою: awk '{print substr ($ 1,2, довжина ($ 1))}' та видалити опцію grep "-q", щоб фактично показати збіги.
Гюго

рядки myDump.txt | grep "черепаха fwd 10"
jedierikb

2
І саме тому ми охоплюємо git.
Обмежене спокутування

можливо, захочеться зробити останній греп -i для випадку ігнорування та скинути -q, щоб насправді побачити відповідний рядок
Белун

13

Найкращий спосіб, який я знайшов для цього, - це менше:

svn log --вербоза | менше

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

Редагувати:

За словами автора, він хоче шукати більше, ніж просто повідомлення та назви файлів. У такому випадку від вас буде потрібно гетто зламати разом із чимось на зразок:

svn diff -r0:HEAD | less

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


5
Це не повний пошук тексту, це пошук у журналах та назви файлів.
rjmunro

Якщо це так, то вам потрібно використовувати більш виразні журнали фіксації. Якщо ви хочете зібрати різницю між ревізіями, це зовсім інший кулька воску. І я особисто не знаю, як це зробити.
Джек М.

> svn diff -r0: HEAD> 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 від Атласа, тих же людей, які приносять вам JIRA. Він здійснює повний пошук тексту у SVN з багатьма іншими корисними функціями.

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


1
Fisheye досить добре. Як ви кажете, не безкоштовно, але ліцензія <= 10 ліцензій становить лише 10 доларів на рік.
Jason S

Наразі 5 користувачів - це 10 доларів, АЛЕ у лише 10 користувачів це стрибки до 1000 доларів!
Мауг каже, що повернемо Моніку


4

Я просто зіткнувся з цією проблемою і

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

зробив роботу за мене. Повернув ревізію першого події і процитував рядок, який я шукав.


1
Працює лише локально і забирає багато часу, якщо сховище є великим.
bahrep

2

Я не маю досвіду з цим, але SupoSE (відкритий код, написаний на Java) - це інструмент, призначений зробити саме це.



1

Зазвичай я роблю те, що каже Джек М (використовую svn log - вербоза), але я намагаюся грепнути замість менше.


5
Це не повний пошук тексту, це пошук у журналах та назви файлів.
rjmunro

Це те, що я зазвичай роблю, але я виявив, що з lessвами ви можете побачити версію, дату тощо, а не лише рядок у коментарі. Це, як правило, те, що я шукаю в будь-якому випадку.
Джек М.

1

Я написав це як скрипт базу, щоб вирішити цю проблему.

Однак це вимагає, щоб пошуковий термін зараз знаходився у файлі файлової системи. Після цього для всіх файлів, які відповідають grep файлової системи, виконується grep всіх svn для цього файлу. Не ідеально, але має бути досить хорошим для більшості використання. Сподіваюся, це допомагає.

/ usr / local / 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 / svnreitions

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