Frage

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

Ich habe zum Beispiel eine Funktion geschrieben, die ich irgendwo verwendet habe, die aber dann nicht benötigt wurde, also habe ich die Dateien per SVN-RM erstellt, aber jetzt muss ich sie wiederfinden, um sie für etwas anderes zu verwenden.Im SVN-Protokoll steht wahrscheinlich so etwas wie „nicht verwendetes Zeug entfernt“, und es gibt jede Menge solcher Check-ins.

Bearbeiten 15.04.2016: Bitte beachten Sie, dass hier mit dem Begriff „Volltextsuche“ gemeint ist Durchsuchen Sie die tatsächlichen Unterschiede im Commit-Verlauf und nicht nach 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 davon svn log Antworten und Kommentare.

War es hilfreich?

Lösung

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

Andere Tipps

svn log in Apache Subversion 1.8 unterstützt ein neuer --search Möglichkeit.So können Sie die Verlaufsprotokollmeldungen des Subversion-Repositorys durchsuchen, ohne Tools und Skripte von Drittanbietern verwenden zu müssen.

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

Sehen SVNBook | svn log Befehlszeilenreferenz.

Wenn Sie Windows verwenden, werfen Sie einen Blick auf SvnQuery.Es verwaltet einen Volltextindex lokaler 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.

Ich verwende ein kleines Shellscript, aber das funktioniert nur für eine einzelne Datei.Sie können dies natürlich mit find kombinieren, um weitere Dateien einzubinden.

#!/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 die svnadmin dump command and grep durch das.

Der beste Weg, den ich gefunden habe, ist mit weniger:

SVN log --verbose | weniger

Sobald weniger ausgegeben wird, können Sie zuschlagen / zu suchen, wie VIM.

Bearbeiten:

Nach Angaben des Autors möchte er mehr als nur die Nachrichten und Dateinamen durchsuchen.In diesem Fall müssen Sie es zusammen mit etwas wie dem folgenden ghettohacken:

svn diff -r0:HEAD | less

Sie können auch ersetzen grep oder etwas anderes, das die Suche für Sie übernimmt.Wenn Sie dies in einem Unterverzeichnis des Repositorys verwenden möchten, müssen Sie verwenden svn log um die erste Revision zu erkennen, in der dieses Verzeichnis existierte, und stattdessen diese Revision zu verwenden 0.

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

svn log -v [repository] > somefile.log

Für Diff können Sie das verwenden --diff Möglichkeit

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

Verwenden Sie dann vim oder nano oder was auch immer Sie verwenden möchten, und führen Sie eine Suche nach dem durch, wonach Sie suchen.Du wirst es ziemlich schnell finden.

Es handelt sich nicht um ein ausgefallenes Skript oder irgendetwas Automatisiertes.Aber es funktioniert.

Obwohl es nicht kostenlos ist, können Sie einen Blick auf Fisheye von Atlassian werfen, den gleichen Leuten, die Ihnen JIRA anbieten.Es führt eine Volltextsuche gegen SVN mit vielen anderen nützlichen Funktionen durch.

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

Ich habe das Gleiche gesucht und Folgendes gefunden:

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

Ich bin gerade auf dieses Problem gestoßen und

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

hat die Arbeit für mich erledigt.Habe die Überarbeitung des ersten Vorkommens zurückgegeben und die gesuchte Zeile zitiert.

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

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

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

Es erfordert jedoch, 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-Diffs für diese Datei durchgeführt.Nicht perfekt, sollte aber für die meisten Anwendungen ausreichend 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 }'

Normalerweise mache ich was Jack M sagt (verwende svn log --verbose), aber ich leite zu grep statt weniger.

Wenn Sie herausfinden möchten, welche Revision für eine bestimmte Codezeile verantwortlich ist, suchen Sie wahrscheinlich nach:

svn blame

Kredit: ursprüngliche Antwort

Ich bin darauf gestoßen Bash-Skript, aber ich habe es nicht ausprobiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top