不确定这是否可能,但我想我会问是否有人知道。是否可以在 Perforce 存储库中找到包含字符串的文件?具体来说,是否可以在不先将整个存储库同步到本地目录的情况下这样做?(它很大——我认为即使我删除了很多东西我也没有空间——这就是存档服务器的用途。)
有许多工具可以搜索本地目录中的文件(我个人使用 Agent Ransack,但这只是其中之一),但这些工具不会搜索远程 Perforce 目录,除非我有一些(最好是免费的)工具不知道有这个功能,或者 Perforce 本身有一些隐藏的功能?
不确定这是否可能,但我想我会问是否有人知道。是否可以在 Perforce 存储库中找到包含字符串的文件?具体来说,是否可以在不先将整个存储库同步到本地目录的情况下这样做?(它很大——我认为即使我删除了很多东西我也没有空间——这就是存档服务器的用途。)
有许多工具可以搜索本地目录中的文件(我个人使用 Agent Ransack,但这只是其中之一),但这些工具不会搜索远程 Perforce 目录,除非我有一些(最好是免费的)工具不知道有这个功能,或者 Perforce 本身有一些隐藏的功能?
p4 grep
是你的朋友。来自perforce 博客
'p4 grep' 允许用户使用简单的文件搜索以及正则表达式来搜索 head 的文件内容以及存储在服务器上的文件的早期版本。虽然不是标准 grep 的每个选项都受支持,但最重要的选项都是可用的。以下是根据“p4 help grep”的命令语法:
p4 grep [ -a -i -n -v -A after -B before -C context -l -L -t -s -F -G ] -e pattern file[revRange]...
另请参阅手册页。
更新:请注意,Perforce 在单个p4 grep
命令中搜索的文件数量是有限制的。大概这是为了帮助降低服务器上的负载。这表现为错误:
Grep revision limit exceeded (over 10000).
如果您有足够的 perforce 权限,您可以使用p4 configure
将dm.grep.maxrevs
设置从默认的 10K 增加到更大的值。例如设置为 100 万:
p4 configure set dm.grep.maxrevs=1M
如果您无权更改此设置,则可以通过将p4 grep
up 拆分为子目录上的多个命令来解决此问题。根据您的仓库结构,您可能需要进一步拆分为子目录等。
例如,可以在 bash shell 中使用此命令一次搜索一个子目录的每个子目录//depot/trunk
。使用p4 dirs
命令从服务器获取子目录列表。
for dir in $(p4 dirs //depot/trunk/*); do
p4 grep -s -i -e the_search_string $dir/...
done
实际上,我自己解决了这个问题。 p4 grep
确实成功了。 文档在这里。您必须仔细缩小范围才能正常工作 - 在我们的服务器上,至少您必须将其缩小到 < 10000 个文件。我还必须将输出重定向到一个文件,而不是在控制台中打印出来,添加> output.txt
,因为控制台中每行有 4096 个字符的限制,而且文件路径很长。
这不是你可以用标准的 perforce 工具做的事情。一个有用的命令可能是p4 print
,但它并不比我想象的同步快。
这是一个很大的问题,但如果您可以访问服务器,您可以在 perforce 目录上运行 agent ransack。Perforce 将所有版本化文件存储在磁盘上,它只是数据库中的元数据。