【问题标题】:Find a string in Perforce file without syncing在 Perforce 文件中查找字符串而不同步
【发布时间】:2014-04-09 05:29:29
【问题描述】:

不确定这是否可能,但我想我会问一下是否有人知道。是否可以在 Perforce 存储库中找到包含字符串的文件?具体来说,是否可以这样做首先将整个存储库同步到本地目录? (它非常大 - 我认为即使我删除了很多东西我也没有空间 - 无论如何这就是存档服务器的用途。)

有许多工具可以搜索本地目录中的文件(我个人使用 Agent Ransack,但这只是其中之一),但这些工具不会搜索远程 Perforce 目录,除非我不知道有一些(最好是免费的)工具具有此功能,或者可能是 Perforce 本身的某些隐藏功能?

【问题讨论】:

    标签: perforce


    【解决方案1】:

    p4 grep 是你的朋友。来自perforce blog

    'p4 grep' 允许用户使用简单的文件搜索以及常规 表达式来搜索 head 的文件内容以及更早的内容 存储在服务器上的文件的修订。虽然不是每一个选项 支持标准 grep,最重要的选项是 可用的。这是根据'p4帮助的命令语法 grep':

    p4 grep [ -a -i -n -v -A after -B before -C context -l -L -t -s -F -G ] -e pattern file[revRange]...
    

    另请参阅the manual page

    更新:请注意,Perforce 在单个 p4 grep 命令中搜索的文件数量是有限制的。大概这是为了帮助降低服务器上的负载。这表现为错误:

    Grep revision limit exceeded (over 10000).
    

    如果您有足够的 perforce 权限,您可以使用 p4 configuredm.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
    

    【讨论】:

    • 哎呀,你在我回答我自己的问题时发布了这个。不过还是谢谢。
    • 没问题,很高兴您找到了答案。现在你只需要找到那个讨厌的字符串;)
    • 我想我会给你打勾,因为你的答案比我的要详细一些,包括手动链接。
    • @Day,您可以将 dm.grep.maxrevs 配置为更高的值,而不是将您的 grep 分解为多个命令。
    • @Bryan 如果您有权访问服务器配置,那么可以。以我的经验,大多数有足够企业精神为 perforce 付费的公司不会让开发人员改变这些东西,也不会立即为他们改变。当您等待“服务器配置更改请求”获得批准时,多个命令技巧将始终有效:) 不过,我已经用此信息更新了答案,因为如果您能做到,那肯定会更容易。谢谢。
    【解决方案2】:

    实际上,我自己解决了这个问题。 p4 grep 确实有效。 Doc here。您必须仔细缩小范围才能正常工作 - 在我们的服务器上,至少您必须将其缩小到 > output.txt,因为控制台中每行有 4096 个字符的限制,而且文件路径很长。

    【讨论】:

    • Here's a trick 通过一次 grep 遍历每个顶级目录来帮助您绕过文件限制。适应环境。
    • 整洁 - 如果我需要再次这样做,我可能会尝试这样做,但我担心如果我经常这样做,我可能会收到 IT 人员的愤怒电话,因为我使用了太多服务器上的 CPU 时间...
    【解决方案3】:

    这不是您可以使用标准 perforce 工具执行的操作。一个有用的命令可能是p4 print,但它并不比我想象的同步快。

    【讨论】:

    • 这不是速度问题,而是磁盘空间问题。我查找了p4 grep,这似乎可以解决问题,但我似乎没有设置权限来做到这一点。 (并且在这里获得 p4 权限就像拔牙一样,所以我宁愿不再这样做。)如果我可以缩小搜索范围,它可能会起作用......
    • 我很尴尬我忘记了p4 grep,我是吵着要它的人之一。
    【解决方案4】:

    这是一个很大的问题,但如果您可以访问服务器,则可以在 perforce 目录上运行 agent ransack。 Perforce 将所有版本化文件存储在磁盘上,它只是数据库中的元数据。

    【讨论】:

    • 谢谢,但我很确定我永远不可能获得这种访问权限。花了一个多星期才获得 Perforce 对该文件夹的访问权限...
    • 您必须多久执行一次此操作?一次,每小时一次,每周一次?或许你可以批量下载文件进行搜索
    • 嗯,到目前为止,在我来过这里的 3 1/2 个月里 - 一次。我需要搜索的代码不是当前代码(我在本地拥有),而是一个较旧的存档版本。年龄太大了,大多数参与它的人都不再在这里工作,甚至没有人知道如何获得许可……这是一家大公司,有时会有很多这样的东西落空。
    • Perforce 因糟糕的管理员而名声不佳,听起来你正在遭受这个问题。看看您是否可以让您的一位 IT 支持人员处理您的案例并让您获得旧版本的权限,然后同步部分代码,直到找到您想要的字符串。
    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 2014-03-16
    • 2015-07-14
    • 1970-01-01
    • 2012-08-25
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多