On this page
Version Control
Perforce P4 for Unreal Engine
Centralized version control built around workspaces, changelists, and exclusive checkout.
P4 is the default for Unreal studios, and Epic's own tools assume it. It's ideal when artists need enforced checkout on binary assets and someone can run the server or pay for P4 Cloud.
What it is
Perforce P4, formerly Helix Core, stores the shared project in a central depot. Each person syncs a workspace, opens files for edit, and submits a numbered changelist back to the server.
Blueprints and maps are binary packages. Two edits to BP_Player or Persistent.umap usually need someone to choose a revision and reapply the other changes by hand.
With the +l file type, P4 rejects a second checkout of the same depot path. Set that type before adding Unreal assets. P4 Cloud provides managed hosting; a self-managed server needs someone responsible for configuration and backups.
With Unreal Engine
Unreal Editor supports P4 directly. With the correct typemap, .uasset and .umap files use exclusive open, which rejects a second checkout of the same depot path.
Where it fits
Strengths
- Exclusive checkout matches Unreal binary asset workflows.
- Changelists group source and asset changes into one submit.
- The Unreal Editor and UnrealGameSync work with Perforce directly.
Tradeoffs
- A self-managed deployment needs an owner for permissions, typemap, backups, and restore tests. P4 Cloud is the managed option.
- The normal sync, open, lock, and submit workflow depends on reaching P4 Server.
- A bad workspace mapping or typemap causes confusing failures inside the editor.
Choose it when
- Artists frequently edit large binary assets that need enforced exclusive checkout.
- The studio can assign an owner for P4 permissions, configuration, and recovery, whether the server is self-managed or hosted through P4 Cloud.
- The pipeline benefits from UnrealGameSync, streams, or Perforce-aware build tooling.
Look elsewhere when
- The team cannot operate or fund a central service with reliable backups.
- Most contributors work offline for long periods and depend on local branching.
- The repository is mostly code and already has a stable Git workflow with little binary history.
How it works
- Depot and workspace
- A depot holds the shared files and their history. A workspace maps depot paths to folders on one machine. P4 Cloud hosts the server, but each contributor still needs a workspace that includes the project.31516
- Changelists
- A numbered changelist groups related adds, edits, and deletes. The submit is atomic, so either every file reaches the depot or none of them do. A useful changelist can contain
BP_Inventory, its input action, and the config change needed to use it.3 - Typemap and exclusive open
- The typemap tells P4 how a file pattern behaves. The
+lmodifier allows only one person to open a depot path for edit at a time. It does not stop someone from changing an already writable local copy outside the normal checkout path. It's ideal to install the Unreal typemap before adding Content, because changing it later means correcting files already in the depot. World Partition levels that use One File Per Actor store each actor in its own package, so two people can lock different actors in the same level.1291317 - Streams and shelves
- Streams describe related lines of development and how changes move between them. Shelving uploads pending files without submitting them. Another user cannot normally unshelve an exclusively locked file while its lock remains, but
p4 printwith the@=changeselector can copy the shelved content out for inspection.41012
In production
- 01
Sync a known working revision
Sync the project before editing
BP_Player. UnrealGameSync can show good and bad changelists and download precompiled editor binaries, so artists can choose a revision that has passed the team's checks. - 02
Check out assets before editing
Connect the editor to the workspace and test checkout with a real
.uasset. P4 makes the owner's workspace copy writable and rejects a second open of that depot path. If a second checkout succeeds, stop and fix the typemap before importing more work.12913 - 03
Keep one purpose per changelist
Move related files out of the default changelist and describe the change. "Fix inventory focus after drop" identifies the work for a reviewer and makes it easier to find later.
- 04
Shelve work that needs another pass
Shelve a risky map, Blueprint, or source change before submit. A reviewer can inspect an exclusively locked shelf with
p4 print. Release or transfer the lock before another user tries to unshelve that file into a workspace.1012 - 05
Validate before submit
Reconcile offline work, resolve incoming text changes, check for unintended generated files, and run the relevant editor or build validation. Submit only after the changelist contains the source and assets needed to reproduce the change.
Best practices
- Install the typemap before content arrives
- Map
.uasset,.umap,.ubulk, and other non-mergeable packages tobinary+lbefore the first add. A later typemap change affects only new files. Correct an existing file by opening it with the intended-ttype and submitting that revision. Thep4 reopen -tcommand only changes a file that is already open.913 - Use case-insensitive server mode for Unreal projects
- Epic recommends a case-insensitive P4 Server to avoid integration problems with its tools, including UnrealGameSync. Decide this when the server is created instead of discovering path-case differences after the depot is populated.18
- Keep generated data out of the depot
- Start from Epic's
P4IGNORErules, then test reconcile on a clean workspace. DerivedDataCache, Intermediate, Saved, and local IDE output create churn without preserving project source. - Treat a changelist as one reviewable change
- Keep the map, Blueprint, config, and source needed for one result together. Shelve that changelist for review or handoff instead of sending loose files or mixing unrelated fixes into the same submit.
- Publish known-good revisions
- Use UnrealGameSync badges or build results to identify changelists that compile and open. Store precompiled editor binaries in the separate location configured for UnrealGameSync.
Gotchas
- The typemap is not retroactive
- Changing a typemap does not correct files already submitted with the wrong type. Open each affected file with the intended type and submit it to record the correction.1913
P4IGNOREmatching differs from.gitignore- The syntax is similar, but the matching rules differ. Copying a Git ignore file without testing can leave generated folders visible to reconcile or hide files the build needs.1
- Locks don't cover other streams
- Exclusive open protects one depot path. Separate stream paths can still carry different revisions of the same Unreal asset and collide when changes integrate later.24
- A checkpoint does not contain depot files
- Checkpoints and journals recover server metadata. They do not replace backups of the versioned file archives, so a metadata-only backup cannot restore the project after storage loss.6
- Writable flags affect builds
- Engine source and precompiled-binary workflows depend on correct P4 file types and writable modifiers. A mismatch can appear as an access-denied build or update failure rather than an obvious source-control error.15
- Secure defaults can break old automation
- P4 Server 2026.1 enforces authentication and removes implicit user behavior. Scripts that depend on unauthenticated access, automatic user creation, or passwordless login need explicit users, credentials, and
p4 loginbefore the upgrade.14
Adoption checklist
- Choose a stream or classic depot model, then document how release work branches and integrates.
- Install Epic's typemap before adding Unreal assets.
- Add a
P4IGNOREfile for DerivedDataCache, Intermediate, Saved, and local IDE output. - Back up both depot archives and server metadata, then test restoration.
- Define who can break locks, administer protections, and recover abandoned workspaces.
- Decide whether UnrealGameSync and precompiled editor binaries belong in the pipeline.
- Run P4 Server in case-insensitive mode for the normal Unreal and UnrealGameSync workflow.
- Use explicit users, authenticated service accounts, and a reviewed protections table.
Related guides
- Git with Git LFSGit version control with separate storage for large files and optional file locking.
- Unity Version ControlVersion control formerly called Plastic SCM, with Smart Locks, a partial-workspace client for artists, and a built-in Unreal provider.
- LoreEpic Games' open-source version control for large binary repositories, currently in pre-stable release.
- DiversionHosted version control with an Unreal Editor plugin and file locks.
Sources
Official sources checked .
- 1Unreal Engine Perforce guidedev.epicgames.com
- 2Perforce exclusive lockinghelp.perforce.com
- 3Perforce workspaces and changelistshelp.perforce.com
- 4Perforce streamshelp.perforce.com
- 5UnrealGameSync referencedev.epicgames.com
- 6Perforce disaster recoveryhelp.perforce.com
- 7Perforce archive verificationhelp.perforce.com
- 8Epic Education guide to version controlcdn2.unrealengine.com
- 9P4 typemap referencehelp.perforce.com
- 10P4 shelving referencehelp.perforce.com
- 11P4 protections referencehelp.perforce.com
- 12P4 unshelve referencehelp.perforce.com
- 13P4 file type modifiershelp.perforce.com
- 14P4 secure-by-default updatehelp.perforce.com
- 15Perforce P4 naming updateperforce.com
- 16Perforce P4 Cloudperforce.com
- 17One File Per Actordev.epicgames.com
Unreal Directive is free and ad-free.
If it saved you time, you can help keep it that way.

