用途
Perforce Shelving 用于将待提交的变更(pending changes)暂存到 Perforce 服务器上,而不实际提交。它适用于以下场景:备份进行中的工作、共享变更以供代码审查、在任务之间切换、在工作区之间转移工作、临时搁置变更,以及提交前审查(Swarm)。
主要能力
- 搁置变更:使用
p4 shelve -c 12345搁置变更列表中的所有文件,或指定文件。支持强制替换已有搁置(-f)。 - 查看搁置变更:使用
p4 changes -s shelved列出搁置的变更列表,p4 describe -S 12345查看详情,p4 diff2对比搁置文件与仓库版本。 - 恢复搁置变更:使用
p4 unshelve -s 12345恢复到同一变更列表,或指定不同变更列表(-c),支持强制覆盖(-f)。 - 删除搁置:使用
p4 shelve -d -c 12345删除搁置文件或整个搁置。 - 直接提交搁置:使用
p4 submit -e 12345提交搁置文件并自动清理搁置。 - 搁置与提交对比:搁置存储在服务器上但不创建修订版本,不影响仓库,通常不触发构建;提交则创建修订版本并影响仓库。
使用方式
基本搁置
# 搁置变更列表中的所有文件
p4 shelve -c 12345
# 搁置特定文件
p4 shelve -c 12345 file1.txt file2.txt
# 替换已有搁置
p4 shelve -f -c 12345
查看搁置
# 列出搁置的变更列表
p4 changes -s shelved
# 列出当前用户的搁置
p4 changes -s shelved -u $P4USER
# 查看搁置变更列表详情
p4 describe -S 12345
恢复搁置
# 恢复到同一变更列表
p4 unshelve -s 12345
# 恢复到不同变更列表
p4 unshelve -s 12345 -c 12346
# 强制恢复(覆盖本地变更)
p4 unshelve -s 12345 -f
删除搁置
# 删除搁置文件
p4 shelve -d -c 12345
# 删除整个搁置
p4 shelve -d -c 12345 //...
提交搁置
# 直接提交搁置文件
p4 submit -e 12345
工作流程
- 工作进度备份:下班前搁置工作,第二天继续;若工作区丢失,可通过恢复搁置找回。
- 任务切换:搁置当前功能的工作,还原本地变更,处理紧急修复后再恢复搁置。
- 代码审查:开发者搁置变更供审查,审查者恢复搁置到工作区进行审查,批准后开发者提交并清理搁置。
- 跨工作区共享:在一个工作区搁置变更,在另一个工作区恢复搁置。
- 集成前测试:搁置功能分支变更,在集成工作区同步主线后恢复搁置进行测试。
高级用法
- 带解决冲突的恢复:使用
p4 unshelve -n -s 12345预览冲突,然后p4 resolve -am自动合并,或-f强制覆盖。 - 更新已有搁置:编辑文件后使用
p4 shelve -f -c 12345更新搁置。 - 部分搁置:仅搁置变更列表中的部分文件。
- 跨流搁置:在不同流之间搁置和恢复,可能需要分支映射。
搁置管理
- 查找旧搁置:
p4 changes -s shelved -u $P4USER - 清理旧搁置:可编写脚本删除超过一定天数的搁置。
- 搁置统计:统计搁置中的文件数量和大小。
Swarm 集成
- 搁置变更后,Swarm 可自动检测并创建审查。
- 根据反馈修改后,使用
p4 shelve -f -c 12345更新搁置,触发审查更新。 - 审查批准后,使用
p4 submit -e 12345提交搁置文件并自动清理。
最佳实践
- 频繁搁置以备份进行中的工作。
- 使用描述性的变更列表名称以便识别。
- 清理旧搁置,避免遗留孤立搁置。
- 重新搁置时使用
-f强制更新。 - 恢复搁置后验证文件是否正确。
- 提交后删除搁置,保持服务器整洁。
- 用于代码审查,提交前进行。
- 不要仅依赖搁置作为永久备份。
- 沟通搁置编号以便协作。
- 提交前测试恢复的代码。
限制与注意事项
- 搁置不创建修订版本,不影响仓库,通常不触发构建。
- 搁置不是永久备份,不应作为唯一备份手段。
- 恢复搁置时可能遇到冲突,需要解决或强制覆盖。
- 删除搁置前需先删除所有文件。
- 权限可能限制恢复搁置操作。
- 跨流搁置可能需要分支映射。
常见问题
- 文件未搁置:检查文件是否在变更列表中打开。
- 无法恢复搁置(冲突):使用
-f强制或解决冲突。 - 搁置未找到:检查变更列表编号,可能已被删除。
- 无权限恢复搁置:检查保护设置,可能需要所有者权限。
- 文件不同:使用
-f替换或解决。 - 无法删除搁置:必须先删除所有文件。