Perforce Shelving
Perforce Shelving
Shelving stores pending changes on the Perforce server without submitting them. This enables code review, work-in-progress backup, sharing between workspaces, and collaboration.
Shelving(暂存)可将待提交的变更存储在Perforce服务器上,无需实际提交。这支持代码评审、在研工作备份、工作区之间的共享及协作。
- Backing up work-in-progress
- Sharing changes for code review
- Switching between tasks
- Transferring work between workspaces
- Parking changes temporarily
- Pre-submit review (Swarm)
- 备份在研工作
- 共享变更以进行代码评审
- 切换任务
- 在工作区之间转移工作
- 临时搁置变更
- 提交前评审(Swarm)
Shelving vs Submitting
Shelving vs 提交
| Feature | Shelving | Submitting |
|---|
| Stored on server | Yes | Yes |
| Creates revision | No | Yes |
| Visible to others | Yes (optional) | Yes |
| Reversible | Easy delete | Need revert |
| Affects depot | No | Yes |
| Builds triggered | Usually no | Usually yes |
| 特性 | Shelving | 提交 |
|---|
| 存储在服务器 | 是 | 是 |
| 创建版本 | 否 | 是 |
| 对他人可见 | 是(可选) | 是 |
| 可撤销 | 易删除 | 需要回退 |
| 影响代码库(depot) | 否 | 是 |
| 触发构建 | 通常不会 | 通常会 |
Shelve all files in changelist
Shelve all files in changelist
Shelve specific files
Shelve specific files
p4 shelve -c 12345 file1.txt file2.txt
p4 shelve -c 12345 file1.txt file2.txt
Shelve and keep files open
Shelve and keep files open
Shelve default changelist
Shelve default changelist
Replace existing shelf
Replace existing shelf
Shelve with delete of local files (submit-like)
Shelve with delete of local files (submit-like)
p4 shelve -c 12345
p4 revert -c 12345 //...
p4 shelve -c 12345
p4 revert -c 12345 //...
View Shelved Changes
查看暂存的变更
List shelved changelists
List shelved changelists
List your shelved changelists
List your shelved changelists
p4 changes -s shelved -u $P4USER
p4 changes -s shelved -u $P4USER
Describe shelved changelist
Describe shelved changelist
List files in shelf
List files in shelf
Diff shelved file vs depot
Diff shelved file vs depot
p4 diff2 //depot/file.txt //depot/file.txt@=12345
p4 diff2 //depot/file.txt //depot/file.txt@=12345
Unshelve to same changelist
Unshelve to same changelist
Unshelve to different changelist
Unshelve to different changelist
p4 unshelve -s 12345 -c 12346
p4 unshelve -s 12345 -c 12346
Unshelve to new changelist
Unshelve to new changelist
p4 unshelve -s 12345 -c default
p4 unshelve -s 12345 -c default
Then move to new CL if desired
Then move to new CL if desired
Unshelve specific files
Unshelve specific files
p4 unshelve -s 12345 file.txt
p4 unshelve -s 12345 file.txt
Force unshelve (overwrite local changes)
Force unshelve (overwrite local changes)
Delete shelved files from changelist
Delete shelved files from changelist
Delete specific files from shelf
Delete specific files from shelf
p4 shelve -d -c 12345 file.txt
p4 shelve -d -c 12345 file.txt
Delete shelf completely
Delete shelf completely
p4 shelve -d -c 12345 //...
p4 shelve -d -c 12345 //...
Promote shelf to commit (delete shelf after submit)
Promote shelf to commit (delete shelf after submit)
Work-in-Progress Backup
在研工作备份
End of day - shelve your work
End of day - shelve your work
Next day - continue working
Next day - continue working
Files already open, shelf is backup
Files already open, shelf is backup
If workspace lost, unshelve to recover
If workspace lost, unshelve to recover
Working on Feature A (CL 12345)
Working on Feature A (CL 12345)
Urgent bug needs fixing
Urgent bug needs fixing
Shelve Feature A work
Shelve Feature A work
Revert local changes (keep shelf)
Revert local changes (keep shelf)
Work on bug fix
Work on bug fix
... fix bug ...
... fix bug ...
p4 submit -d "Fix critical bug"
p4 submit -d "Fix critical bug"
Resume Feature A
Resume Feature A
Code Review Workflow
代码评审工作流
Developer: Shelve for review
Developer: Shelve for review
p4 shelve -c 12345
echo "Please review CL 12345"
p4 shelve -c 12345
echo "Please review CL 12345"
Reviewer: Get shelved changes to review workspace
Reviewer: Get shelved changes to review workspace
p4 unshelve -s 12345 -c default
p4 unshelve -s 12345 -c default
Review code...
Review code...
Reviewer: Revert after review (or keep to test)
Reviewer: Revert after review (or keep to test)
Developer: After approval, submit
Developer: After approval, submit
p4 submit -c 12345
p4 shelve -d -c 12345 # Clean up shelf
p4 submit -c 12345
p4 shelve -d -c 12345 # Clean up shelf
Share Between Workspaces
工作区之间共享
Workspace A: Shelve changes
Workspace A: Shelve changes
Workspace B: Get shelved changes
Workspace B: Get shelved changes
(in different workspace)
(in different workspace)
p4 unshelve -s 12345 -c default
p4 unshelve -s 12345 -c default
Now both workspaces have the changes
Now both workspaces have the changes
Pre-Integration Testing
预集成测试
Shelve feature branch changes
Shelve feature branch changes
In integration workspace:
In integration workspace:
Unshelve feature changes
Unshelve feature changes
Test integration
Test integration
... run tests ...
... run tests ...
If tests pass, developer can submit
If tests pass, developer can submit
If tests fail, developer can fix
If tests fail, developer can fix
Shelve with Resolve
带冲突解决的暂存恢复
When unshelving conflicts with current workspace
When unshelving conflicts with current workspace
Preview unshelve conflicts
Preview unshelve conflicts
Unshelve and resolve
Unshelve and resolve
p4 unshelve -s 12345
p4 resolve -am # Auto-merge
p4 unshelve -s 12345
p4 resolve -am # Auto-merge
Or force overwrite
Or force overwrite
Update Existing Shelf
更新已有的暂存内容
Make more changes
Make more changes
... edit file ...
... edit file ...
Update shelf with new changes
Update shelf with new changes
-f (force) replaces existing shelf
-f (force) replaces existing shelf
Shelve only some files from changelist
Shelve only some files from changelist
p4 shelve -c 12345 important.cs critical.cs
p4 shelve -c 12345 important.cs critical.cs
Leave other files unshelved but still open
Leave other files unshelved but still open
Shelve Across Streams
跨流暂存
Shelve in one stream
Shelve in one stream
Unshelve to different stream (if mappings allow)
Unshelve to different stream (if mappings allow)
May need branch mapping
May need branch mapping
p4 unshelve -s 12345 -b branch_mapping
p4 unshelve -s 12345 -b branch_mapping
Find your old shelves
Find your old shelves
p4 changes -s shelved -u $P4USER
p4 changes -s shelved -u $P4USER
Find shelves older than 30 days
Find shelves older than 30 days
p4 changes -s shelved -u $P4USER | while read line; do
CL=$(echo $line | awk '{print $2}')
DATE=$(p4 change -o $CL | grep "^Date:" | awk '{print $2}')
echo "$CL: $DATE"
done
p4 changes -s shelved -u $P4USER | while read line; do
CL=$(echo $line | awk '{print $2}')
DATE=$(p4 change -o $CL | grep "^Date:" | awk '{print $2}')
echo "$CL: $DATE"
done
Clean Up Old Shelves
清理旧的暂存内容
cleanup-shelves.sh
cleanup-shelves.sh
Delete shelves older than 30 days
Delete shelves older than 30 days
CUTOFF=$(date -v-30d +%Y/%m/%d)
p4 changes -s shelved -u $P4USER | while read line; do
CL=$(echo $line | awk '{print $2}')
DATE=$(echo $line | awk '{print $4}')
if [[ "$DATE" < "$CUTOFF" ]]; then
echo "Deleting old shelf: $CL ($DATE)"
p4 shelve -d -c $CL //...
fi
done
CUTOFF=$(date -v-30d +%Y/%m/%d)
p4 changes -s shelved -u $P4USER | while read line; do
CL=$(echo $line | awk '{print $2}')
DATE=$(echo $line | awk '{print $4}')
if [[ "$DATE" < "$CUTOFF" ]]; then
echo "Deleting old shelf: $CL ($DATE)"
p4 shelve -d -c $CL //...
fi
done
Count files in shelf
Count files in shelf
p4 describe -S -s 12345 | grep "^..." | wc -l
p4 describe -S -s 12345 | grep "^..." | wc -l
Size of shelved files
Size of shelved files
p4 describe -S -s 12345 | grep "^..." | while read line; do
FILE=$(echo $line | awk '{print $1}')
p4 fstat -Ol "$FILE@=$CL" 2>/dev/null | grep fileSize
done
p4 describe -S -s 12345 | grep "^..." | while read line; do
FILE=$(echo $line | awk '{print $1}')
p4 fstat -Ol "$FILE@=$CL" 2>/dev/null | grep fileSize
done
Shelve for Swarm Review
为Swarm评审暂存变更
Create review-ready changelist
Create review-ready changelist
p4 change # Add description with review info
p4 change # Add description with review info
Shelve for Swarm
Shelve for Swarm
Swarm automatically detects and creates review
Swarm automatically detects and creates review
Or trigger manually:
Or trigger manually:
POST to Swarm API
POST to Swarm API
Make changes based on feedback
Make changes based on feedback
... make changes ...
... make changes ...
Update shelf (triggers review update in Swarm)
Update shelf (triggers review update in Swarm)
Commit After Approval
批准后提交
After review approved in Swarm
After review approved in Swarm
-e submits shelved files directly
-e submits shelved files directly
Cleans up shelf automatically
Cleans up shelf automatically
- Shelve frequently - Backup work in progress
- Use descriptive changelist names - Easy to identify shelves
- Clean up old shelves - Don't leave orphaned shelves
- Force update with when re-shelving
- Verify unshelve - Check files are correct
- Delete shelf after submit - Keep server clean
- Use for code review - Before committing
- Don't rely solely on shelves - Not a permanent backup
- Communicate shelf numbers - For collaboration
- Test unshelved code - Before submitting
- 频繁暂存 - 备份在研工作
- 使用描述性的变更列表名称 - 便于识别暂存内容
- 清理旧的暂存内容 - 不要留下无人维护的暂存
- 重新暂存时使用强制更新
- 验证恢复的暂存内容 - 检查文件是否正确
- 提交后删除暂存内容 - 保持服务器整洁
- 用于代码评审 - 提交前进行评审
- 不要仅依赖暂存内容 - 这不是永久备份
- 告知他人暂存的变更列表编号 - 便于协作
- 测试恢复的暂存代码 - 提交前进行测试
| Issue | Solution |
|---|
| "Files not shelved" | Check files are open in changelist |
| "Can't unshelve - conflicts" | Use to force or resolve |
| "Shelf not found" | Check changelist number, may be deleted |
| "No permission to unshelve" | Check protections, may need owner |
| "Files differ" | Use to replace or resolve |
| "Can't delete shelf" | Must delete all files first |
| 问题 | 解决方案 |
|---|
| "Files not shelved" | 检查文件是否在变更列表中处于打开状态 |
| "Can't unshelve - conflicts" | 使用强制恢复或解决冲突 |
| "Shelf not found" | 检查变更列表编号,可能已被删除 |
| "No permission to unshelve" | 检查权限设置,可能需要拥有者权限 |
| "Files differ" | 使用替换或解决差异 |
| "Can't delete shelf" | 必须先删除所有暂存文件 |
Common Commands Reference
常用命令参考
p4 shelve -c CL # Shelve changelist
p4 shelve -f -c CL # Replace existing shelf
p4 shelve -d -c CL # Delete shelf
p4 shelve -c CL # Shelve changelist
p4 shelve -f -c CL # Replace existing shelf
p4 shelve -d -c CL # Delete shelf
p4 unshelve -s CL # Unshelve to same CL
p4 unshelve -s CL -c TARGET # Unshelve to different CL
p4 unshelve -f -s CL # Force unshelve
p4 unshelve -s CL # Unshelve to same CL
p4 unshelve -s CL -c TARGET # Unshelve to different CL
p4 unshelve -f -s CL # Force unshelve
p4 describe -S CL # View shelved changelist
p4 changes -s shelved # List all shelves
p4 changes -s shelved -u USER # List user's shelves
p4 describe -S CL # View shelved changelist
p4 changes -s shelved # List all shelves
p4 changes -s shelved -u USER # List user's shelves
Submit shelved
Submit shelved
p4 submit -e CL # Submit shelf directly
p4 submit -e CL # Submit shelf directly