2008-09-04 9 views
115

Gibt es eine Möglichkeit, eine Volltextsuche eines Subversion-Repositorys durchzuführen, einschließlich des gesamten Verlaufs?Durchsuchen des Subversion-Verlaufs (Volltext)

Zum Beispiel habe ich eine Funktion geschrieben, die ich irgendwo verwendet habe, aber dann wurde es nicht benötigt, also habe ich die Dateien gefunden, aber jetzt muss ich es wieder finden, um es für etwas anderes zu verwenden. Das svn log sagt wahrscheinlich etwas wie "entfernte unbenutzte Sachen", und es gibt eine Menge Checkins wie diese.

bearbeiten 2016.04.15: Bitte beachten Sie, dass was mit dem Begriff „Volltextsuche“ hier gefragt wird, wird zu die tatsächlichen Diffs der Geschichte begehen suchen, und nicht die Dateinamen und/oder Commit-Nachrichten . Ich weise darauf hin, weil die obige Formulierung des Autors dies nicht sehr gut widerspiegelt - da er in seinem Beispiel genauso gut nur nach einem Dateinamen und/oder einer Commit-Nachricht suchen könnte. Daher viele der svn log Antworten und Kommentare.

+5

Apache Subversion 1.8 akzeptiert '--search' Argument für' svn log' Befehl. Siehe meine Antwort unter http://stackoverflow.com/a/17473516/761095 – bahrep

+1

'svn log --search' führt keine Volltextsuche durch, wie von @rjmunro benötigt, sondern sucht nur nach Autor, Datum, Log-Nachricht und Liste von veränderte Pfade. – zb226

Antwort

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

Guter Punkt. Die gitk-GUI macht diese Art der Suche sehr gut und es ist einfach, die git svn-Tools zu verwenden, um auf ein svn-Repository zuzugreifen. Seit ich diese Frage gestellt habe, habe ich mich komplett auf die Verwendung von Git verlegt, daher könnte es für mich etwas spezifisch sein, diese Antwort zu akzeptieren. – rjmunro

+0

Wenn Sie nur die Commit-Nachrichten durchsuchen möchten, verwenden Sie 'git log --grep regex'. –

+2

Beachten Sie, dass dies je nach Größe Ihres Repositorys eine Weile dauern kann. Für mich hat es mehr als eine Stunde gedauert. – Stijn

2

Ich habe keine Erfahrung damit, aber SupoSE (open source, geschrieben in Java) ist ein Werkzeug, um genau dies zu tun.

9

Ich habe nach etwas ähnlichem gesucht. Das Beste, was ich mir ausgedacht habe, ist OpenGrok. Ich habe noch nicht versucht, es umzusetzen, klingt aber vielversprechend.

+0

Ich benutze OpenGrok seit mehreren Monaten, es rockt. –

11

Der beste Weg, die ich gefunden habe, dies zu tun ist mit weniger:

svn log --verbose | weniger

Sobald weniger kommt mit Ausgang auf, du /, wie VIM zu suchen treffen kann.

Edit:

Nach Ansicht des Autors, er will mehr als nur die Nachrichten und den Dateinamen suchen. In diesem Fall werden Sie zu erforderlich Ghetto-Hack zusammen mit so etwas wie:

svn diff -r0:HEAD | less 

Sie auch grep oder etwas ersetzen können sonst suchen für Sie zu tun. Wenn Sie dies für ein Unterverzeichnis des Repositorys verwenden möchten, müssen Sie svn log verwenden, um die erste Revision zu erkennen, in der das Verzeichnis vorhanden war, und diese Revision anstelle von 0 verwenden.

+4

Das ist keine Volltextsuche, es werden die Protokolle und Dateinamen gesucht. – rjmunro

+0

Wenn dies der Fall ist, müssen Sie aussagekräftigere Commit-Protokolle verwenden. Wenn Sie den Unterschied zwischen Revisionen grep, das ist ganz andere Kugel aus Wachs. Und ich persönlich kenne keine Möglichkeit, das zu tun. –

+0

> svn diff -r0: KOPF> log > weniger log ist meine Wahl auf Windows. Danke – kingoleg

0

ich in der Regel tun, was Jack M sagt (Verwendung svn log --verbose), aber ich Rohr grep statt weniger.

+5

Das ist nicht Volltextsuche, es sucht die Protokolle und Dateinamen. – rjmunro

+0

Das ist, was ich normalerweise am Ende mache, aber ich habe festgestellt, dass man mit 'less' tatsächlich die Revision, das Datum usw. sehen kann, anstatt nur die Zeile im Kommentar. Das ist normalerweise das, wonach ich eigentlich suche. –

22

Wenn Sie Windows haben einen Blick auf SvnQuery. Es verwaltet einen Volltextindex der lokalen oder Remote-Repositorys. Jedes Dokument, das jemals an ein Repository übergeben wurde, wird indexiert. Sie können Google-ähnliche Abfragen über eine einfache Weboberfläche ausführen.

+0

Es wäre großartig, wenn SvnQuery immer noch gepflegt würde, aber leider ist es gestorben und jetzt funktioniert es einfach nicht mehr. –

21

Ich verwende ein kleines Shellskript, aber das funktioniert nur für eine einzige Datei. Sie können dies natürlich mit find kombinieren, um weitere Dateien einzuschließen.

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

Wenn Sie wirklich alles suchen möchten, verwenden Sie den Befehl svnadmin dump und grep durch das.

+2

+1 für den Admin-Dump-Zeiger. – akuhn

+0

Ich musste das "r" von Revisionsnummern mit: awk '{print substr ($ 1,2, length ($ 1))} entfernen und die grep "-q" -Option entfernen, um die Übereinstimmungen tatsächlich anzuzeigen. – Hugo

+0

Zeichenketten myDump.txt | grep "turtle fwd 10" – jedierikb

6

Während nicht frei, können Sie sich Fisheye von Atlassian ansehen, die gleichen Leute, die Ihnen JIRA bringen. Es macht Volltextsuche gegen SVN mit vielen anderen nützlichen Funktionen.

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

+1

Fisheye ist ziemlich gut. Wie Sie sagen, nicht kostenlos, aber die <= 10 Committer-Lizenz ist nur 10 $/Jahr. –

+0

Gegenwärtig sind 5 Benutzer $ 10, ABER bei nur 10 Benutzern springt es auf $ 1.000! – Mawg

2

Ich lief in dieses Problem und

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

hat den Job für mich. Gab die Revision des ersten Vorkommens zurück und zitierte die gesuchte Zeile.

+2

Funktioniert nur für den lokalen Pfad. –

+1

Funktioniert nur lokal und benötigt viel Zeit, wenn ein Repository groß ist. – bahrep

1

Ich schrieb dies als Cygwin Bash-Skript, um dieses Problem zu lösen.

Es erfordert jedoch, dass der Suchbegriff derzeit in der Dateisystemdatei ist. Für alle Dateien, die dem Dateisystem grep entsprechen, wird dann ein grep aller svn diffs für diese Datei ausgeführt. Nicht perfekt, sollte aber für die meisten Anwendungen gut genug sein. Hoffe das hilft.

/usr/local/bin/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/local/bin/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 }' 
+0

'A' für Anstrengung! (benutze einfach git :)) –

-3

Ich kam in dieser bash script, aber ich habe es nicht versucht .

32

svn log in Apache Subversion 1.8 unterstützt a new --search option. So können Sie in Subversion-Repository-Verlaufsprotokollnachrichten suchen, ohne Tools und Skripte von Drittanbietern zu verwenden.

svn log --search sucht in Autor, Datum, Protokollnachrichtentext und Liste der geänderten Pfade.

Siehe SVNBook | svn log command-line reference.

+6

Handlich, aber keine Volltextsuche. Ich bleibe bei der git-svn Antwort :-) – rjmunro

+4

Nicht, dass svn Repos auf googlecode noch immer auf svn 1.6 laufen ... siehe: https://code.google.com/p/support/wiki/ SubversionFAQ # What_version_of_Subversion_do_you_use? Aber aktualisieren Sie Ihren Client auf 1,8 (und Svn Upgrade von einem ausgecheckten Repo) können Sie Svn Log --search auf dem Repo ... –

+0

Die Arbeitskopie benötigt alle Updates, aber dieser Befehl listet das Ganze auf Änderung einschließlich Revisionsnummer, geänderte Dateien und Kommentar. Wie ist es nicht Volltext? –

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

für diff Sie die --diff Option verwenden können

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

dann vim oder nano verwenden oder was auch immer Sie möchten verwenden, und eine Suche für das, was Sie suchen. Du wirst es ziemlich schnell finden.

Es ist kein schickes Skript oder etwas Automatisiertes. Aber es funktioniert.

+0

AFAICS, das sucht Commit-Nachrichten, nicht die tatsächlichen Diffs. – rjmunro

+0

Verwenden Sie dann svn log -v --diff [repository]> somefile.log – JREN

2

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

-1

Falls Sie versuchen, für eine bestimmte Codezeile verantwortlich, welche Revision ist, um zu bestimmen, suchen Sie wahrscheinlich für:

svn blame 

Credit: original answer