Suche nach Subversion-Verlauf (Volltext)

135

Gibt es eine Möglichkeit, eine Volltextsuche in einem Subversion-Repository durchzuführen, einschließlich des gesamten Verlaufs?

Zum Beispiel habe ich eine Funktion geschrieben, die ich irgendwo verwendet habe, aber dann wurde sie nicht benötigt, also habe ich die Dateien gespeichert, aber jetzt muss ich sie wieder finden, um sie für etwas anderes zu verwenden. Das SVN-Protokoll sagt wahrscheinlich so etwas wie "nicht verwendetes Material entfernt", und es gibt eine Menge solcher Checkins.

Edit 2016-04-15: Bitte beachten Sie, dass hier unter dem Begriff "Volltextsuche" gefragt wird, ob die tatsächlichen Unterschiede im Festschreibungsverlauf und nicht Dateinamen und / oder Festschreibungsnachrichten durchsucht werden sollen . 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 svn logAntworten und Kommentare.

rjmunro
quelle
6
Apache Subversion 1.8 akzeptiert --searchArgument für svn logBefehl. Siehe meine Antwort unter stackoverflow.com/a/17473516/761095
bahrep
3
svn log --searchführt keine Volltextsuche durch, wie von @rjmunro gefordert, sondern durchsucht nur Autor, Datum, Protokollnachricht und Liste der geänderten Pfade.
zb226

Antworten:

77
git svn clone <svn url>
git log -G<some regex>
Luis Gutierrez
quelle
1
Guter Punkt. Die gitk-GUI führt diese Art der Suche sehr gut durch, und es ist einfach, die git svn-Tools zu verwenden, um auf ein svn-Repository zuzugreifen. Zugegeben, seit ich diese Frage gestellt habe, habe ich mich ganz der Verwendung von Git zugewandt. Daher könnte es für mich etwas spezifisch sein, diese Antwort zu akzeptieren.
rjmunro
4
Beachten Sie, dass dies je nach Größe Ihres Repositorys eine Weile dauern kann. Für mich hat es mehr als eine Stunde gedauert.
user247702
20
Ich habe diese Lösung abgelehnt, da die Konvertierung eines großen SVN-Repositorys in GIT oft nicht möglich ist oder viel zu lange dauern würde. Es ist, als würde man Java empfehlen, wenn man eine Frage zu einem C # -Sprachenkonstrukt hat.
Ooxi
3
Möglicherweise müssen Sie ein zusätzliches Paket für diesen Befehl installieren. Unter Ubuntu möchten Sie apt-get install git-svn.
nedned
5
Kauft "svn log --verbose --diff | grep ..." nicht ungefähr die gleiche Funktionalität, ohne git verwenden zu müssen?
Lyte
41

svn logIn Apache unterstützt Subversion 1.8 eine neue --searchOption . So können Sie die Protokollnachrichten des Subversion-Repository-Verlaufs durchsuchen, ohne Tools und Skripte von Drittanbietern zu verwenden.

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

Siehe SVNBook | svn logBefehlszeilenreferenz .

bahrep
quelle
7
Praktische, aber keine Volltextsuche. Ich
bleibe
4
Nicht, dass im Moment SVN-Repos auf Google Code noch auf SVN 1.6 ausgeführt werden ... siehe: code.google.com/p/support/wiki/… ? Wenn Sie Ihren Client jedoch auf 1,8 aktualisieren (und ein ausgechecktes Repo-SVN aktualisieren), können Sie das SVN-Protokoll verwenden - Suche auf dem Repo ...
Mario Ruggier
Die Arbeitskopie benötigt alle Aktualisierungen, aber dieser Befehl listet die gesamte Änderung auf, einschließlich der Versionsnummer, der geänderten Dateien und des Kommentars. Wie ist es nicht Volltext?
Bernhard Döbler
24

Wenn Sie Windows ausführen, schauen Sie sich SvnQuery an . Es verwaltet einen Volltextindex von lokalen oder Remote-Repositorys. Jedes Dokument, das jemals in ein Repository übertragen wurde, wird indiziert. Sie können Google-ähnliche Abfragen über eine einfache Weboberfläche durchführen.

Christian Rodemeyer
quelle
Es wäre großartig, wenn SvnQuery noch gewartet würde, aber leider ist es gestorben und jetzt funktioniert es überhaupt nicht mehr.
Dan Atkinson
Ich habe einen funktionierenden Klon (?) Unter github.com/kalyptorisk/svnquery/releases gefunden
Philip Helger
21

Ich verwende ein kleines Shellscript, aber dies funktioniert nur für eine einzelne 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 durchsuchen möchten, verwenden Sie den svnadmin dumpBefehl und durchsuchen Sie ihn .

Bas Grolleman
quelle
Ich musste das "r" aus den Revisionsnummern entfernen mit: awk '{print substr ($ 1,2, length ($ 1))}' und die grep-Option "-q" entfernen, um die Übereinstimmungen tatsächlich anzuzeigen.
Hugo
Zeichenfolgen myDump.txt | grep "turtle fwd 10"
jedierikb
2
Und deshalb umarmen wir Git.
Begrenzte Versöhnung
Vielleicht möchten Sie das letzte grep -i für den Fall ignorieren und das -q löschen, um tatsächlich die übereinstimmende Zeile zu sehen
Belun
13

Der beste Weg, dies zu tun, ist mit weniger:

svn log --verbose | weniger

Sobald weniger Ausgabe erfolgt, können Sie /wie bei VIM auf die Suche klicken.

Bearbeiten:

Laut dem Autor möchte er mehr als nur die Nachrichten und Dateinamen suchen. In diesem Fall müssen Sie das Ghetto zusammen mit etwas wie: hacken.

svn diff -r0:HEAD | less

Sie können auch ersetzen grepoder etwas anderes, um die Suche für Sie durchzuführen. Wenn Sie dies in einem Unterverzeichnis des Repositorys verwenden möchten, müssen Sie svn logdie erste Revision erkennen, in der dieses Verzeichnis vorhanden war, und diese Revision anstelle von verwenden 0.

Jack M.
quelle
5
Das ist keine Volltextsuche, sondern die Suche nach Protokollen und Dateinamen.
rjmunro
Wenn dies der Fall ist, müssen Sie aussagekräftigere Festschreibungsprotokolle verwenden. Wenn Sie den Unterschied zwischen Revisionen erkennen möchten, ist das eine ganz andere Wachskugel. Und ich persönlich kenne keinen Weg, das zu tun.
Jack M.
> svn diff -r0: HEAD> log> weniger log ist meine wahl unter windows. Vielen Dank
Kingoleg
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.

Mike Schall
quelle
Ich benutze OpenGrok seit mehreren Monaten, es rockt.
Mauricio Scheffer
7
svn log -v [repository] > somefile.log

Für diff können Sie die --diffOption verwenden

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

Verwenden Sie dann Vim oder Nano oder was auch immer Sie verwenden möchten, und suchen Sie nach dem, wonach Sie suchen. Sie werden es ziemlich schnell finden.

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

JREN
quelle
AFAICS, das sucht nach Commit-Nachrichten, nicht nach den tatsächlichen Unterschieden.
rjmunro
Verwenden Sie dann svn log -v --diff [Repository]> somefile.log
JREN
6

Obwohl Sie nicht frei sind, können Sie sich Fisheye von Atlassian ansehen, die gleichen Leute, die Ihnen JIRA bringen. Es führt eine Volltextsuche gegen SVN mit vielen anderen nützlichen Funktionen durch.

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

mrjabba
quelle
1
Fisheye ist ziemlich gut. Wie Sie sagen, nicht kostenlos, aber die <= 10 Committer-Lizenz beträgt nur 10 US-Dollar pro Jahr.
Jason S
Derzeit sind 5 Benutzer 10 US-Dollar, ABER bei nur 10 Benutzern springt es auf 1.000 US-Dollar!
Mawg sagt, Monica am
4

Ich bin gerade auf dieses Problem gestoßen und

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

hat den Job für mich gemacht. Hat die Revision des ersten Vorkommens zurückgegeben und die gesuchte Zeile zitiert.

pfyon
quelle
1
Funktioniert nur lokal und nimmt viel Zeit in Anspruch, wenn ein Repository groß ist.
Bahrep
2

Ich habe keine Erfahrung damit, aber SupoSE (Open Source, geschrieben in Java) ist ein Tool, das genau dafür entwickelt wurde.

dF.
quelle
2

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

Zednight
quelle
1

Normalerweise mache ich das, was Jack M sagt (benutze svn log --verbose), aber ich pfeife zu grep anstatt zu weniger.

Mark Biek
quelle
5
Das ist keine Volltextsuche, sondern die Suche nach Protokollen und Dateinamen.
rjmunro
Das ist es, was ich normalerweise mache, aber ich habe festgestellt, dass lessSie tatsächlich die Revision, das Datum usw. sehen können, anstatt nur die Zeile im Kommentar. Das ist normalerweise das, wonach ich suche.
Jack M.
1

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

Es ist jedoch erforderlich, dass sich der Suchbegriff derzeit in der Dateisystemdatei befindet. Für alle Dateien, die mit dem Dateisystem grep übereinstimmen, wird dann ein grep aller svn-Unterschiede 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="$@"
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="$@"
    svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print  $1 }'
James McGuigan
quelle
'A' für Mühe! (benutze einfach git :))
Begrenzte Versöhnung
-1

Wenn Sie versuchen festzustellen, welche Revision für eine bestimmte Codezeile verantwortlich ist, suchen Sie wahrscheinlich nach:

svn blame

Gutschrift: ursprüngliche Antwort

DustWolf
quelle
-3

Ich bin auf dieses Bash-Skript gestoßen , habe es aber nicht ausprobiert.

Douglas Smith
quelle