Suchen Sie im SVN-Repository nach einem Dateinamen

84

Wir haben ein Massen-Repository für Code, das Tausende von Ordnern und Unterordnern enthält. Ich möchte unter diesem Repositor mit Dateinamen oder mit einem Wort suchen.

Root folder
    a\
    b\
    c\
    d\
    e\
    f\ab\
    f\ab\cd.txt

Ich möchte nach cd.txt suchen, weiß aber nicht, wo es sich im SVN-Repository befindet. Dazu möchte ich eine Suche im Stammordner von SVN durchführen, in den ich den Dateinamen cd.txt eingebe und den Befehl ausführe jeder Ordner und zeigt die Datei Details Ergebnis ....

Die Hoffnungsanforderung ist klar. Können Sie mir bitte dabei helfen?

Nakilon
quelle
Ich hatte gehofft, dass Sie einen clientseitigen Befehl eingeben können, der die Suche auf der Serverseite ausführt. Dieses SVN-Repo, mit dem ich arbeite, hat schreckliche Antwortzeiten und Übertragungsraten über VPN. Leider scheint das nicht möglich zu sein.
Patrick M

Antworten:

60

Wenn sich die Datei in Ihrer Arbeitskopie befindet, verwenden Sie SVN 1.5:

svn list --depth infinity | grep <filename>

oder eine frühere Version von svn:

find . -name <filename> -not -path '*.svn*'

Wenn Sie die Datei im Verlauf suchen müssen (gelöscht oder verschoben):

svn log -v | less

und suchen Sie danach mit:

\<filename><return>
lmop
quelle
3
svn list --depth unendlich funktioniert gut, in Windows haben Sie natürlich nicht standardmäßig grep, ich habe es einfach in eine Textdatei kopiert und mit einem Texteditor durchsucht:
Mandrake
4
In Windows PowerShell können Sie ... | select-string <filename>als Ersatz für verwenden grep.
MarnixKlooster ReinstateMonica
2
In einem normalen Windows ... | find "<filename>"funktioniert die Befehlszeile auch als Ersatz für grep. HINWEIS : Die "sind um Dateinamen erforderlich.
Raystorm
7
Wenn sich die Datei in meiner Arbeitskopie befindet, brauche ich svn nicht, um sie zu finden. Sie sollten hinzufügen, wie das Repo wie die Antworten von Anton und Marios durchsucht wird. Vielleicht ist das für Sie offensichtlich, aber es waren ihre Antworten, die das Licht für das einfache alte Ich anmachten.
Lieven Keersmaekers
1
Sie können svn co --depth empty REPOURL RepoDir, cd RepoDirund svn list --depth infinitydann werden alle Dateipfade vom SVN - Server erhalten (möglicherweise Millionen von Zeilen produzieren , wenn Sie Millionen haben).
Ivan Akcheurov
58

Folgendes funktioniert für mich (SVN-Version 1.4.6)

svn list -R <URL> | grep "<file_pattern>"
Marios V.
quelle
6
Toll. Dies funktioniert für Schildkröte. In Windows: SVN-Liste -R myurl >> results.txt
Live-Love
Funktioniert sehr gut. Auch viel einfacher, sich nur an "-R" zu erinnern als an "--depth infininity".
MPV
Langsam für große Repos, dann besser svn-crawler unten verwenden.
Karsten
17

Mit Zugriff auf das Repo selbst verwenden (dh auf Ihrem SVN-Host-Dateisystem)

svnlook tree [path_to_repo] | grep [file_name]  

oder um alle Repos zu durchsuchen (wenn Sie mehrere Repos eingerichtet haben).

for i in \`ls [path_to_repos_dir]`; do echo $i; svnlook tree [path_to_repos_dir]/$i | grep -i [file_or_folder_name]; done 

Die Option --full-path gibt den vollständigen Pfad im Repo zur Datei an (falls gefunden).

Beispiel:

for i in `ls /u01/svn-1.6.17/repos`; do echo $i; svnlook tree --full-paths /u01/svn- 1.6.17/repos/$i | grep -i somefile.txt; done

Leiten Sie die Ausgabe in eine Datei um, wenn eine statische Kopie erforderlich ist.
setzt die Verwendung von nix OS voraus.

Robert Iles
quelle
3
+1 für die Verwendung von "svnlook tree --full-path <Pfad_zu_Repo> | grep <Dateiname>". Dies ist der schnellste Weg, den ich gefunden habe, um eine Dateisuche in einem Subversion-Repo durchzuführen.
Nick Grealy
blitzschnelle Suche, sehr nützlich.
Dustin Cook
12

svn list --depth infinity <your-repo-here>um eine Liste der Dateien im Repo svn catzu erhalten und dann den Inhalt zu erhalten. Sie können --xmldem listBefehl einen Schlüssel hinzufügen , um das Parsen etwas zu vereinfachen.

Anton Gogolev
quelle
Denken grepSie daran, zu verwenden, wenn Sie 1 Datei anzeigen möchten, insbesondere wenn Sie Tausende von Dateien im Repository haben, wie z. B. das OP. Es gibt auch einen --incrementalModus, wenn Sie die Ausgabe mit einer späteren / früheren XML-Ausgabe verbinden müssen.
Tryse
6

Kürzlich habe ich mein Dienstprogramm veröffentlicht, um das Repository aufzulisten. Das ist viel schneller als der Ansatz "svn ls --depth infinity". Hier sind die Benchmarks . Es wird nur eine Funktion aufgerufen, die in der internen Subversion-API verfügbar ist, aber jetzt über eine Befehlszeile zugänglich ist.

So kannst du rennen

$ svn-crawler <URL> | grep "<file_pattern>"
Dmitry Pavlenko
quelle
Schönes Werkzeug. Ich habe mit CentOS7 getestet. Ich musste libsvn_delta und libsvn_subr zur Liste target_link_libraries in CMakeLists.txt hinzufügen und auch LIBAPR_LIBRARY_INCLUDE von "include / apr-1.0" an "include / apr-1" anpassen.
Karsten
4

Wenn Sie TortoiseSVN verwenden, können Sie dies versuchen, WENN Sie bereit sind, Projekt für Projekt zu suchen - funktioniert für mich:

  1. Erstellen Sie ein leeres Projekt unter der URL Ihrer obersten Repository-Ebene und nennen Sie es BLANK
  2. Klicken Sie im linken Bereich auf die Repo-URL
  3. Wählen Sie im rechten Bereich Ihr BLANK-Projekt und Ihr gewünschtes Projekt aus - sagen Sie Trunk
  4. Klicken Sie mit der rechten Maustaste, um das Browser-Menü aufzurufen, und wählen Sie "URLs vergleichen". Je nach Größe Ihres Repos kann das Laden eine Minute dauern. Grundsätzlich erhalten Sie jedoch Ihre gesamte Projektliste in einer Suchliste.
  5. Geben Sie Ihren Dateinamen oder eine andere Zeichenfolge in den Suchfilter ein
dci_dave
quelle
-2

Wenn das Remote-Repository Ihres Unternehmens nicht sehr groß ist, können Sie auf einfache Weise Folgendes auschecken: Sie können ein "Checkout" durchführen, um ein lokales Repository abzurufen. Wenn Sie sich auf einem Windows-Computer befinden, verwenden Sie "Suchen" oder auf einem Linux-Computer den Befehl "Suchen".

Antony Raja
quelle