Perforce Basics
Overview
Perforce (P4) is a centralized version control system optimized for large codebases and binary assets. This skill covers essential daily operations.
When to Use
- •Syncing latest changes
- •Editing files for modification
- •Adding new files
- •Deleting files
- •Submitting changes
- •Reverting unwanted changes
Core Concepts
File States
| State | Description | Command to Change |
|---|---|---|
| Not in depot | File exists locally but not tracked | p4 add |
| Synced | File matches depot version | - |
| Edited | Open for edit, modified locally | p4 edit then modify |
| Added | Marked for addition to depot | p4 add |
| Deleted | Marked for deletion from depot | p4 delete |
| Out of date | Depot has newer version | p4 sync |
Revision Specifiers
bash
# Specific revision number file.txt#3 # Head revision (latest) file.txt#head # Changelist number file.txt@12345 # Label file.txt@release_1.0 # Date/time file.txt@2024/01/15 file.txt@2024/01/15:14:30:00 # Revision range file.txt#2,#5 file.txt@10000,@12000
Sync Operations
Basic Sync
bash
# Sync entire workspace to head p4 sync # Sync specific path p4 sync //depot/project/... # Sync specific file p4 sync //depot/project/file.txt # Sync to specific revision p4 sync //depot/project/...#head p4 sync //depot/project/...@12345 # Sync to specific changelist p4 sync @12345
Sync Options
bash
# Preview sync (don't actually sync) p4 sync -n //depot/project/... # Force sync (re-download even if up to date) p4 sync -f //depot/project/... # Parallel sync (faster for many files) p4 sync --parallel=threads=4 //depot/project/... # Safe sync (don't clobber writable files) p4 sync -s //depot/project/... # Sync and show affected files p4 sync //depot/project/... 2>&1 | head -50
Selective Sync
bash
# Sync only specific file types p4 sync //depot/project/....cs p4 sync //depot/project/....prefab # Sync excluding paths (use workspace view instead) # Or sync specific subdirectories p4 sync //depot/project/Assets/Scripts/...
Edit Operations
Opening Files for Edit
bash
# Edit single file p4 edit file.txt # Edit multiple files p4 edit *.cs # Edit files in directory p4 edit Assets/Scripts/... # Edit with specific changelist p4 edit -c 12345 file.txt # Edit to default changelist p4 edit -c default file.txt
Check Edit Status
bash
# See files open for edit p4 opened # See files open in specific changelist p4 opened -c 12345 # See files open by all users p4 opened -a //depot/project/... # See who has file open p4 opened -a //depot/project/file.txt
Add Operations
Adding New Files
bash
# Add single file p4 add newfile.txt # Add multiple files p4 add *.cs # Add files recursively p4 add Assets/NewFeature/... # Add to specific changelist p4 add -c 12345 newfile.txt # Add with specific file type p4 add -t binary+l largefile.bin p4 add -t text+x script.sh
File Types
bash
# Common file types text # Text file, diff/merge enabled binary # Binary file, no diff/merge unicode # Unicode text symlink # Symbolic link # Modifiers +l # Exclusive lock (only one user can edit) +w # Always writable on client +x # Executable bit +S # Only head revision stored (saves space) +F # Check for RCS keywords # Examples p4 add -t binary+l Assets/Textures/hero.psd # Locked binary p4 add -t text Assets/Scripts/Player.cs # Text file
Delete Operations
Deleting Files
bash
# Delete single file p4 delete file.txt # Delete multiple files p4 delete *.bak # Delete in specific changelist p4 delete -c 12345 file.txt # Delete files matching pattern p4 delete //depot/project/....tmp
Handling Deleted Files
bash
# See deleted files in depot p4 files //depot/project/...@head | grep "delete change" # Recover deleted file (sync old revision, then add) p4 sync //depot/project/file.txt#head-1 p4 add file.txt # Or use obliterate (admin only) to permanently remove
Revert Operations
Reverting Changes
bash
# Revert single file p4 revert file.txt # Revert all files in changelist p4 revert -c 12345 //... # Revert all open files p4 revert //... # Revert unchanged files only p4 revert -a //... # Revert with preview p4 revert -n //...
Revert to Specific Revision
bash
# Sync to old revision (makes file read-only) p4 sync //depot/project/file.txt#3 # To actually revert content and submit: p4 sync //depot/project/file.txt#head p4 edit file.txt p4 sync -f //depot/project/file.txt#3 p4 resolve -ay file.txt # Now submit
Submit Operations
Submitting Changes
bash
# Submit default changelist (opens editor for description) p4 submit # Submit specific changelist p4 submit -c 12345 # Submit with description p4 submit -d "Fix player movement bug" # Submit specific files from default changelist p4 submit file.txt # Submit and reopen files for further editing p4 submit -r -c 12345
Pre-Submit Checks
bash
# Check what will be submitted p4 opened -c default # Check for conflicts before submit p4 sync p4 resolve # Verify files are correct p4 diff -se //... # Files that differ from depot # Check changelist description p4 change -o 12345
Status Commands
Workspace Status
bash
# Files open for edit/add/delete p4 opened # Files that need sync p4 sync -n //... # Files modified but not opened (reconcile needed) p4 status # Reconcile local changes with depot p4 reconcile //...
Depot Status
bash
# List files in depot p4 files //depot/project/... # List files with specific pattern p4 files //depot/project/....cs # Get file info p4 fstat //depot/project/file.txt # Detailed file info p4 fstat -Ol //depot/project/file.txt
Reconcile Operations
Finding Untracked Changes
bash
# Find all local changes not in Perforce p4 reconcile //... # Preview reconcile p4 reconcile -n //... # Reconcile specific types p4 reconcile -e //... # Edited files p4 reconcile -a //... # Added files p4 reconcile -d //... # Deleted files # Reconcile to specific changelist p4 reconcile -c 12345 //...
Common Workflows
Daily Sync Workflow
bash
# 1. Check for open files p4 opened # 2. Sync latest p4 sync # 3. Resolve any conflicts p4 resolve # 4. Continue working
Edit-Submit Workflow
bash
# 1. Open file for edit p4 edit file.txt # 2. Make changes # ... edit file ... # 3. Verify changes p4 diff file.txt # 4. Submit p4 submit -d "Description of changes"
Add New Files Workflow
bash
# 1. Create files locally # ... create files ... # 2. Add to Perforce p4 add newfile.txt # 3. Verify p4 opened # 4. Submit p4 submit -d "Add new feature files"
Best Practices
- •Always sync before editing - Avoid conflicts
- •Use descriptive changelist descriptions - Help others understand
- •Submit related changes together - Atomic commits
- •Revert unchanged files with
p4 revert -a - •Check
p4 openedbefore leaving for the day - •Use
p4 reconcileto catch local changes - •Preview with
-nbefore destructive operations - •Use exclusive locks for binary files
- •Don't submit broken code - Test first
- •Keep changelists small - Easier to review/revert
Troubleshooting
| Issue | Solution |
|---|---|
| "File not on client" | Run p4 sync first |
| "Can't edit - not synced" | Sync file, then edit |
| "Can't clobber writable file" | Use p4 sync -f or fix permissions |
| "File already open" | Check p4 opened -a for who has it |
| "Out of date" | Sync and resolve before submit |
| "No such file" | Check path, use p4 files to verify |