Durchsuchen des Subversion-Verlaufs (Volltext)
-
09-06-2019 - |
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.
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.
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.
Ich habe das Gleiche gesucht und Folgendes gefunden:
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.