在SVN代码库中搜索文件名

89

我们有一个包含数千个文件夹和子文件夹的代码批量仓库,我想要以文件名或某个单词为关键字在这个仓库中进行搜索。

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

我想搜索 cd.txt 但不知道它在 SVN 存储库中的位置,因此我想在 SVN 的根文件夹中执行搜索,在其中输入文件名 cd.txt 并运行命令,将检查每个文件夹并显示文件详细信息结果...

希望要求清楚。你能否帮我处理一下?


我曾希望有一种客户端命令可以输入,可以在服务器端执行搜索。我正在使用的这个 SVN 存储库在 VPN 上具有可怕的响应时间和传输速率。然而,很遗憾,这似乎不可能实现。 - Patrick M
9个回答

66

以下内容对我有效(svn版本为1.4.6)

svn list -R <URL> | grep "<file_pattern>"

8
好的。这适用于Tortoise。在Windows中:svn list -R myurl >> results.txt - live-love
1
非常好用。只需要记住“-R”比“--depth infinity”容易得多。 - MPV
对于大型仓库来说速度较慢,建议使用下面的svn-crawler。 - karsten

62

如果文件在您的工作副本中,且您正在使用svn 1.5:

svn list --depth infinity | grep <filename>

或者svn的早期版本:

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

如果您需要查找历史记录中的文件(已删除或移动):

svn log -v | less

并使用以下方式进行搜索:

\<filename><return>

3
svn list --depth infinity 命令在 Windows 系统下可以正常工作,当然默认情况下你没有 grep 工具,你可以将命令的输出保存到文本文件中,然后使用文本编辑器搜索其中的内容。 - Mandrake
5
在Windows PowerShell中,你可以使用... | select-string <filename>来替换grep - MarnixKlooster ReinstateMonica
4
在常规的Windows命令行中,... | find "<filename>"也可以作为grep的替代。 注意:需要在filename周围加上引号。 - Raystorm
7
如果文件在我的工作副本中,我不需要使用svn来找到它。你应该加入如何搜索仓库的方法,就像Anton和Marios的回答一样。也许这对你来说很明显,但正是他们的回答为我这个简单的老实人点亮了灯。 - Lieven Keersmaekers
1
你可以使用命令svn co --depth empty REPOURL RepoDircd RepoDir,然后使用命令 svn list --depth infinity 从 SVN 服务器获取所有文件路径(如果有数百万个文件,则可能会产生数百万行)。 - Ivan Akcheurov
确认" | find "似乎在正常的Windows 11下工作。然而,在我看来,这完全是上世纪90年代的过时方式。应该作为任何SVN图形界面的一部分有一个搜索功能。存储库浏览器不是搜索功能。 - user5248982

19

如果您可以访问存储库本身(例如在svn主机文件系统上),请使用以下命令:

svnlook tree [path_to_repo] | grep [file_name]  

或者搜索所有仓库(如果您设置了多个仓库)。

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 
将显示文件在仓库中的完整路径(如果找到)。
示例:
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

如果需要静态副本,请将输出重定向到文件中。
假定使用 Nix 操作系统。


3
使用"svnlook tree --full-paths <path_to_repo> | grep <filename>" 得到 +1。这是我在 Subversion 仓库中进行文件搜索的最快方式。 - Nick Grealy
闪电般快速的搜索,非常有用。 - Dustin Cook

12

svn list --depth infinity <your-repo-here> 可以获取版本库中文件的列表,然后使用 svn cat 获取内容。您可以在 list 命令中添加 --xml 关键字以使解析变得更加简单。


如果您想查看一个文件,特别是如果仓库中有数千个文件,则请记得使用grep。此外,如果您需要将输出与之前/之后的XML输出连接起来,则可以使用--incremental模式。 - trysis

6

最近我发布了实用工具来列出存储库,比"svn ls --depth infinity"方法快得多。这里是基准测试。它只调用一个在Subversion内部API中可用的函数,但现在可以通过命令行访问。

所以你可以运行

$ svn-crawler <URL> | grep "<file_pattern>"

不错的工具。我已经在CentOS7上测试过了。我需要将libsvn_delta和libsvn_subr添加到CMakeLists.txt中target_link_libraries列表中,同时将LIBAPR_LIBRARY_INCLUDE从“include/apr-1.0”改为“include/apr-1”。 - karsten

4
如果您正在使用TortoiseSVN,并且愿意按项目查看,可以尝试以下方法,这对我很有效:
  1. 在您的仓库顶层URL下创建一个空白项目,将其命名为BLANK
  2. 单击左窗格上的Repo URL
  3. 在右窗格中选择您的BLANK项目和所需项目(例如trunk)
  4. 右键单击以弹出浏览器菜单,然后选择“比较URLs”。根据您的存储库大小,加载可能需要一分钟。但是,您基本上会得到整个项目列表,可供“准备搜索”。
  5. 在搜索过滤器中输入文件名或其他字符串

1

我不确定使用额外的工具来过滤搜索结果,比如svn+grep是否是一个好主意。这些工具,如grepsvn-crawler可能在Windows或其他操作系统上不可用/无法工作,您需要安装/升级它们。

您可以使用1个单独的svn命令来解决此任务,使用--search标志支持glob模式:

> svn ls -R --search "readme.md"
branches/0.13.x/readme.md
trunk/readme.md

> svn ls -R --search "*.md"
branches/0.13.x/189.md
branches/0.13.x/readme.md
trunk/189.md
trunk/readme.md

关于 svn ls --search 选项的更多信息:

> svn ls -h                                
list (ls): List directory entries in the repository.
usage: list [TARGET[@REV]...]

  List each TARGET file and the contents of each TARGET directory as
  they exist in the repository.  If TARGET is a working copy path, the
  corresponding repository URL will be used. If specified, REV determines
  in which revision the target is first looked up.

...

Valid options:
  ...
  --search ARG             : use ARG as search pattern (glob syntax, case-
                             and accent-insensitive, may require quotation marks
                             to prevent shell expansion)

0

-2
如果您的远程存储库不是很大,那么一种简单的方法是:您可以执行“checkout”以获取本地存储库。如果您在Windows机器上,则使用“搜索”命令;如果在Linux机器上,则使用“查找”命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接