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.


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>

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 .


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.


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 .


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.


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


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.


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/


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.


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.


2

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


1

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


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 }'

'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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.