Perforce 操作手册

8 分钟
本页目录

P4 的 workspace 映射、服务器 have list 和本地文件内容可以不同步。先确认 P4PORT、P4USER、P4CLIENT,再决定是同步文件、登记修改、shelve 还是提交。示例路径和 changelist 需要替换。

当前任务入口
同步后文件位置不对映射与 have list
离线改动未被发现登记与提交
交接未提交工作Shelve 与恢复

先查映射,不用强制同步掩盖问题

确认服务、身份与 workspace

# 确认实际连接的服务、用户与 client
p4 info

核对 Server address、User name、Client name、Client root;错误先从连接参数与认证排查,不执行 sync。

# 检查当前登录票据状态
p4 login -s

过期时通过 p4 login 交互登录,再重查;不要把密码写进命令行。配置来源有疑问时单独 p4 set 检查 P4PORT/P4USER/P4CLIENT 等。

# 读取 client 的 Root、View 或 Stream 映射
p4 client -o

这是读取,不修改 workspace;需要改映射时先保存规格并确认本地工作归属,再通过 p4 client 编辑。

# 对照 depot、client 与本地路径
p4 where //depot/project/file.txt

替换为实际 depot 文件;not in client view 指向映射范围问题,强制 sync 不能修复错误的 View。

# 读取服务器记录的已同步版本
p4 have //depot/project/...

... 包含该范围递归文件;have 不读取磁盘验证一致性。

先预览同一范围,再同步

# 预览将添加、更新或删除的本地文件
p4 sync -n //depot/project/...

核对数量、路径与目标版本,保存需要保留的本地修改;确认后才执行下一条。

# 把已审阅范围同步到当前 depot 版本
p4 sync //depot/project/...

固定版本可在同一 file spec 后附 @CHANGE 或 #REV,先按同一 spec 预览。完成后核对输出与 have;有已打开文件或覆盖保护报错时先处理该文件,不能假定所有路径都成功。

p4 where 对照 depot、client 和本地路径;Root、View 或 Stream 错了,就会同步到错误位置。client name 是逻辑工作区名,不要求等于主机名。have 记录上次同步版本,不读取文件内容证明它仍一致。

正在呈现知识画面
have list 和磁盘字节不是同一份状态

sync -k 只更新服务器记录,磁盘保持原内容;sync -f 才重新传输,#none 则移除本地受控文件与 have 记录。

操作本地文件have list
p4 sync PATH更新到指定版本,受打开文件与覆盖保护约束同步更新
p4 sync -f PATH强制重新传输;先确认没有要保留的本地修改同步更新
p4 sync -k PATH不传输、不修改文件只更新记录;等价于 flush,可能人为制造不一致
p4 sync "//depot/project/...#none"移除该范围内受版本控制的本地文件,遵循打开文件规则清除对应 have 记录

#none 不是“只清元数据”,引号还可避免 shell 把符号当特殊语法。操作前用同范围的 sync -n 预览;不要默认 -f 就能解决映射错误。

先打开文件,再审阅 changelist

按变更类型选择一种打开方式

以下 edit / add / delete / move 面向不同文件,不是一份全部执行的脚本。路径相对当前 workspace;执行前已确认映射。

# 将已跟踪文件打开为编辑
p4 edit file.txt

随后编辑文件并用 p4 diff file.txt 审阅。

# 将已创建的新文件登记为待添加
p4 add new-file.txt

命令不替你写文件内容;用 p4 opened 检查 add 状态。

# 将不再需要的文件登记为删除
p4 delete obsolete-file.txt

会影响本地文件并在提交后删除 depot 当前版本;提交前用 opened 核对目标,误选时先审阅 revert 的恢复影响。

# 记录带历史关联的重命名
p4 move old-name.txt new-name.txt

源文件须按服务器/workspace 要求先打开为 edit;目标名不能占用。opened 应出现 move/delete 与 move/add 配对,之后核对新路径内容。

离线编辑需要先发现再登记

# 预览当前目录递归范围内的未登记改动
p4 reconcile -n ...

核对新增/修改/删除,排除生成物后再用限范围 p4 reconcile path/to/file 登记。未打开文件的补丁可用 p4 diff -f file.txt,-f 在这里是检查未打开文件,不是强制同步。

# 创建一个带任务说明的 numbered changelist
p4 change

编辑 Description 和 Files,保存后记录输出的编号;下文 12345 是该编号示例,不应照抄。

P4 默认不会把任意磁盘写入自动收进 changelist。离线改动先 reconcile -n 看 add/edit/delete,再限范围 reconcile;未打开的文件可用 p4 diff -f 查看。创建 numbered changelist 后,用 reopen 移动已打开文件。

整理列表、解决冲突、再提交

# 将已打开文件移动到目标待提交列表
p4 reopen -c 12345 file.txt

-c 选择 changelist,不会把尚未打开的任意文件自动加入。

# 核对该列表的路径、动作与文件类型
p4 opened -c 12345

再用 p4 diff -du file.txt 逐文件看内容;新增文件直接审阅工作文件。p4 describe -s 12345 的摘要不替代补丁检查。

# 预览该 changelist 尚需解决的集成或同步冲突
p4 resolve -n -c 12345

需要解决时选择 p4 resolve -c 12345,按提示逐项审阅,随后 diff、测试并再次预览;不要无条件选接受某一侧。

# 提交已核对、测试并解决冲突的列表
p4 submit -c 12345

成功后记录 submitted change 编号,并用 p4 describe -s NUMBER 核对。失败先读错误和 opened 状态,不要认为列表已经提交。

放弃本地修改需单独确认

# 预览将撤销的打开动作
p4 revert -n file.txt

保存需要的内容后才用 p4 revert file.txt;edit 的修改会丢弃,add 的本地文件处理与 delete 不同,按动作读结果。仅清理未修改文件时可选 p4 revert -a,仍先限制范围和预览。

12345 为待提交列表的示例。resolve 预览后按每个冲突决定合并;提交前确认内容、测试和目标 stream。p4 revert 会放弃已打开文件的工作改动;p4 revert -a 只处理符合条件的未修改文件,也应先检查。

Shelve 是服务器上的未提交内容

保存 shelf 并核对服务器副本

# 把待提交列表内容保存为服务器 shelf
p4 shelve -c 12345

用已创建的 changelist 编号;此操作既不 submit,也不清除本地工作。

# 读取 shelf 的文件与补丁确认保存内容
p4 describe -S 12345

接收方可用 p4 changes -s shelved -u YOUR_USER 找到列表;用户名称从 info 或交接记录取得。

在接收 workspace 恢复到新的列表

先在接收方确认映射与本地工作,并通过 p4 change 创建目标 12346;它与来源 12345 是两个编号。

# 从来源 shelf 恢复到目标待提交列表
p4 unshelve -s 12345 -c 12346

随后 p4 opened -c 12346、diff 与 p4 resolve -n -c 12346 检查,必要时解决冲突并测试。源 shelf 仍保留,跨 stream 恢复还需确认映射规则。

# 仅在交接完成且无需保留时删除来源 shelf
p4 shelve -d -c 12345

这不等于 revert 本地工作,也不删除已提交历史;删除前再次 describe -S 核对编号与内容。

历史、逐行来源与 stream 规格按需查询

# 查看文件 revision 与集成历史
p4 filelog file.txt

需要逐行追溯时另用 p4 annotate file.txt,再回到对应 changelist 查原因;不是按顺序修改文件的步骤。

# 读取所选 stream 的父子关系与路径规则
p4 stream -o //streams/main

替换为实际 stream 名,与 client -o 的 Stream 字段对照。

shelve 不会提交 depot,也不会自动清空本地修改;unshelve 放入目标 changelist,可能需要 resolve。替换既有 shelf 前确认接收者使用的版本;删除 shelf 与 revert 本地文件是不同动作。跨 stream 的映射和集成来源需单独检查。

p4 sync · p4 reconcile · p4 shelve