P4 Stream 与 Sparse Stream
P4 Stream 与 Sparse Stream
Stream 是 P4 的分支模型,比手工维护 branch mapping 省心很多——分支视图自动生成 workspace view 和 branch view。这篇记 Stream 的基本概念、四种路径类型、创建流程,以及更轻量的 Sparse Stream 和并行 sync 配置。
Stream 基础
Stream 存放在 Stream depot 里,这是一种与标准 depot 平行的特殊 depot。
三种标准 Stream 类型:
- Mainline:整个 stream 体系的主干。
- Development:长期项目、大的新功能。
- Release:修 bug、测试、发布分发。
另外两种:
- Virtual stream:用来收窄匹配范围,只在 stream view 里 share 需要的目录同步到本地。它不是真正的分支,提交会直接传到上游父分支,不能在此分支做合并。
- Task stream:轻量级分支,做 bug fix 和新功能。它的大部分元数据是临时存在一组私有表里,task stream 被删除或卸载时,它在未改动文件上的元数据也一并移除,对 P4 服务影响很小。它只对工作在这个分支的 workspace 可见,别人看不到。如果在这个分支上的人数到一定规模,可以转成 Development Stream。
流转方向是 Merge down(从父往子合)& Copy up(从子往父推)。
Stream 路径类型
Stream view 用一组路径加路径类型来描述这个 stream 包含哪些文件、能做哪些操作:
- Share:可 sync、submit、integrate(branch/merge/copy)。改动会在 stream 间流动,主线文件一般都是 share。
- Isolate:可在本 stream 内 edit、submit,但改动不能 integrate 到别的 stream。适合新功能开发——在本地管理它的历史,稳定了再挪到 share 给别人 sync,或者整个丢弃。在那之前不会干扰别人,也不影响主线稳定。
- Import:可 sync,但不能 edit 或 integrate。适合第三方库这类构建需要、但从不改动的成分。
- Exclude:不能 sync、submit、integrate。
| 路径类型 | Merge/Copy | Branch | Sync | Submit |
|---|---|---|---|---|
| share | Y | Y | Y | Y |
| isolate | N | N | Y | Y |
| import | N | N | Y | N |
| exclude | N | N | N | N |
路径语法
Stream path 语法跟 depot path 类似,去掉前导的 //depot名 和 stream 名:
Depot path: //Stream/main/code/...
Stream path: code/...
一条 stream view 由三部分组成:
Path_Type Stream_Path [Reference_Stream_Path]
Reference_Stream_Path 用于从别的 depot 导入文件,例如 import data/... //Test/data/... 表示把 depot Test 里的 data 文件夹导入到本 stream 根下。
注意:stream view 不允许通配符 *、位置符 %%1、overlay 映射 +。
父子继承
子 stream 从父 stream 继承文件夹路径和行为规则:
- Permissiveness(允许哪些操作):子 stream 永远不能比父更宽松。四种路径类型从宽到严是 share > isolate > import > exclude。
- Inclusiveness(包含哪些路径):子不能比父更全。父没包含的文件夹路径,子里也不能加。
创建 Stream
创建 Main Stream
所有 stream 都要在 Stream Depot 里,depot 由 IT 创建,数据管理者建主 stream。
File > New > Stream...,或在 Stream Graph 空白处右键New Stream...。- 填 stream 名("main" 或 "mainline" 比较直观)。
- Stream type 设为 mainline。
- 选这个 stream 落在哪个 stream depot。
- (可选)勾上用这个 stream 立即建一个 workspace。
- (可选)勾上创建后让你往里加文件。
- 勾 Locked,只让 stream owner 改主 stream 的设置。
- 取消勾 submitting restricted to stream owner,否则别人没法把自己 stream 的改动 copy up 到 main。
- 编辑 Paths(通常就一句
share ...,表示 main 里所有文件都可同步、提交、集成)。 - 点 OK。如果第 6 步勾了 populate,会弹窗问怎么往新 main stream 加文件:从本地文件系统 copy,或从 server depot branch。前者用 Add Files Wizard 拖拽添加;后者填 source files/folders 后 Branch。
创建 Development Stream
用 Stream 功能必须工作在 Stream workspace 里。Stream workspace 跟标准 workspace 不同,它的映射从 stream view 自动生成、不可手编。
- Stream Graph 里右键 main,选
Create New Stream from 'main'...。 - 填 stream 名。
- Stream type 选 development。
- Change propagation 勾 To parent 和 From parent。
- 确认父是 main。
- 勾 Locked 和 Submitting Restricted to stream owner,这样别人能 sync 但不能 submit。
- 编辑 Paths。建议只把你会改的文件放 share 路径(copy up 前 share 路径里的文件都得是最新的),构建需要但不改的放 import 路径。
- 点 OK,Stream Graph 里出现新 stream。
- 如果之前没勾 branch from parent,会出现绿色 merge down 箭头,双击 stream 选 Merge。
- 合并后 share 路径文件被同步,import 路径文件要手动 sync。
提交到自己的 dev stream 并 copy up 到 main
- 往自己 dev stream 提交,步骤和标准 depot 一样。
- 提交后 Stream Graph 出现绿色 copy up 箭头,双击 stream 选 Copy。
- P4 会要求切到工作在 "main" 的 workspace,没有就新建一个。
- Copy 对话框里改 changelist 描述。可勾 Do not copy newly branched target files to workspace 省磁盘。
- Copy 完别的 dev stream 上会出现绿色 merge down 箭头,别人就能拿到你的改动。
- 如果 copy up 箭头是橙色、merge down 箭头是绿色,说明 main 变了、你的 dev stream 过时了,copy up 之前要先从 main merge 下来。
切换 stream 时,如果两个 stream 的 workspace root 不同,本机会有两份文件副本。虽然占空间,但分开 root 更安全,能避免文件冲突。多数情况下开发者只需要保证自己 stream 的 workspace 最新,因为 copy up 前本来就强制要更新文件。
Sparse Stream
Sparse stream 是更轻量的分支方式:文件只在需要时才 branch,新 stream 不会从父 stream 那里搬来全部元数据,因此每个分支存的数据量大幅减少,省时省资源。适合 "branch per bug" / "branch per feature" 这种用法。
好处:
- 瞬间新建分支。
- 每分支存储量显著下降。
- 省时省资源。
限制:
- 不支持部分集成(只允许
@<=change这种 revision 限制)。 - 不能 reparent。
- 不能从别的 stream unshelve。
- 不支持 undo。
- 不能有子 stream,例外是可以有一层 virtual stream(且这个 virtual 子不能再有子)。
- 非 sparse stream 不能转成 sparse stream。
- 不能作为其他 stream 的 component 被消费。
创建 sparse stream
新建 stream 时类型选 development (sparse) 或 release (sparse)。在 advanced 设置里,Paths 参数可以改成需要的父分支 CL 节点,点 OK。
由于 sparse stream 不会自动 branch 父分支文件,创建后 depot tree 里看不到它,P4 server 也不产生存储数据。
使用 sparse stream
在 depot tree 里 checkout 父分支的文件,文件就会 branch 到 sparse stream 供使用。每 branch 一个文件到 sparse stream 都会生成一条提交记录。
更新父分支 CL 到 sparse stream
- 方法一:把父分支 merge 到 sparse 分支,会把 sparse stream 对应的父分支 CL 号更新到最新。
- 方法二:在 sparse stream spec 里直接改 share CL,或用命令
p4 merge @CL改到指定 CL 号。此时 Pending 面板会出现对 stream spec 的修改和需要解决冲突的文件,提交这个 spec 修改会应用到所有用该 sparse stream 的 workspace。
转成普通 stream
右键要转的 sparse stream,选 "Check out and convert sparse stream",点 convert。这会把父分支所有文件 branch 到当前分支,提交 pending 后完成转换。转换不可逆。
参考:Sparse streams、Introducing sparse streams 网络研讨会。
开启并行 Sync
命令行直接指定并行度,--parallel=0 表示用服务器配置的最大并行:
p4 sync --parallel=0 //test/...
Warning
P4V 默认就是 Parallel Sync(用服务器设置的最大并行数)。Log 里只会显示一行 p4 sync e:\Pilot\...#head,但在 P4D 的 monitor 里能看到多个 transmit 命令同时跑。
P4V、UGS 里也有各自的并行 sync 选项,在偏好/同步设置里开。