鉴于您主要关心的是尽可能高效地执行此操作(对服务器的影响最小且脚本编写最少),我建议您执行以下操作:
p4 -c Client_Test client -s -S //toto/test
p4 -c Client_Test print //Client_Test/file.txt
“client -s”命令没有明显的服务器开销,因为它不操作任何文件内容甚至任何文件元数据;它只是创建流形成模板的“视图”,它反过来通过定义您在该流的上下文中使用哪些库文件来提供运行其他命令的上下文。这就是使“//Client_Test/file.txt”语法映射到正确文件的原因,无论它是在任务流的“影子表”中,还是在软件仓库的公开可见部分,或者从另一个流中导入,或者父流中的重新映射路径等。
如果出于哲学原因您决定不使用客户端规范,您可以这样做:
p4 -c nonexistentclientspec client -o -S //toto/test
这将向您显示客户端视图,而无需在数据库中实际创建客户端规范。使用 Perforce 脚本 API 之一,捕获“视图”字段然后将其转换为 Map 对象并不难——这就是您确定导入来源的方式,允许您处理您提到的异常,有一些困难。
如果您在哲学上甚至无法通过“p4 client”命令查看假设的客户端视图,那么您的下一个最佳选择是解析流规范本身;当然,有一个确定性系统可以根据流规范生成视图,因此您可以自己重新实现该系统,但难度要大得多。
但是,如果主要关注的是效率和易用性,我建议使用客户端规范。如果您仍然对服务器开销持怀疑态度,请使用“-Ztrack”运行这些命令,看看他们需要做多少工作,例如:
C:\p4\test>p4 -Ztrack -c Client_Test client -s -S //stream/task
Client Client_Test switched.
--- lapse .015s
--- rpc msgs/size in+out 0+1/0mb+0mb himarks 2000/2000 snd/rcv .000s/.000s
--- db.user
--- pages in+out+cached 3+0+2
--- locks read/write 1/0 rows get+pos+scan put+del 1+0+0 0+0
--- db.group
--- pages in+out+cached 3+0+2
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0
--- db.stream
--- pages in+out+cached 7+0+2
--- locks read/write 5/0 rows get+pos+scan put+del 1+11+11 0+0
--- db.domain
--- pages in+out+cached 14+8+2
--- locks read/write 8/2 rows get+pos+scan put+del 10+0+0 2+0
--- db.template
--- pages in+out+cached 8+0+2
--- locks read/write 6/0 rows get+pos+scan put+del 0+6+12 0+0
--- db.view
--- pages in+out+cached 6+4+2
--- locks read/write 2/1 rows get+pos+scan put+del 0+2+4 1+1
--- db.have
--- pages in+out+cached 3+0+2
--- locks read/write 0/0 rows get+pos+scan put+del 0+1+1 0+0
--- peek count 1 wait+held total/max 0ms+0ms/0ms+0ms
--- db.working
--- pages in+out+cached 5+0+2
--- locks read/write 2/0 rows get+pos+scan put+del 0+3+3 0+0
--- peek count 1 wait+held total/max 0ms+0ms/0ms+0ms
--- db.trigger
--- pages in+out+cached 3+0+2
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0
--- db.bodtext
--- pages in+out+cached 3+0+2
--- locks read/write 1/0 rows get+pos+scan put+del 2+0+0 0+0
--- db.protect
--- pages in+out+cached 3+0+2
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+3 0+0
--- db.monitor
--- pages in+out+cached 6+6+2
--- locks read/write 0/2 rows get+pos+scan put+del 0+0+0 2+0
请注意,对于实际的客户端切换,只重写了一个数据库条目;大部分开销是与身份验证和输出相关的基本上可以忽略不计的数量(单行告诉我它成功了)。