不确定这是否可行,但我想我会问是否有人知道。是否可以在Perforce存储库中找到包含字符串的文件?具体来说,是否有可能没有首先将整个存储库同步到本地目录? (它非常大 - 即使我删除了很多东西,我也不认为我有空间 - 这就是存档服务器无论如何。)
有许多工具可以搜索本地目录中的文件(我个人使用Agent Ransack,但它只是其中之一),但这些不搜索远程Perforce目录,除非有一些(最好是免费的)工具我不知道有这种能力,或者Perforce本身可能有一些隐藏的功能吗?
答案 0 :(得分:9)
p4 grep
是你的朋友。来自perforce blog
'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
分割为子目录上的多个命令来解决此问题。根据您的软件仓库结构,您可能需要进一步拆分为子子目录等。
例如,可以在bash shell中使用此命令一次搜索//depot/trunk
的每个子目录。使用p4 dirs
命令从服务器获取子目录列表。
for dir in $(p4 dirs //depot/trunk/*); do
p4 grep -s -i -e the_search_string $dir/...
done
答案 1 :(得分:2)
实际上,我自己解决了这个问题。 p4 grep
确实可以解决问题。 Doc here 的。你必须在它正常工作之前仔细缩小它 - 在我们的服务器上至少你必须把它缩小到< 10000个文件。我还必须将输出重定向到文件,而不是在控制台中将其打印出来,添加> output.txt
,因为控制台中每行限制为4096个字符,文件路径很长。
答案 2 :(得分:1)
使用标准的perforce工具无法做到这一点。一个有用的命令可能是p4 print
,但它并不比我想的同步快。
答案 3 :(得分:0)
这是一个很大的if,但如果您有权访问服务器,则可以在perforce目录上运行代理搜索。 Perforce将所有版本化文件存储在磁盘上,它只是数据库中的元数据。