Wiki
.uversionignore
gitignore-style syntax to exclude files from uVersion tracking. UE5 defaults included, recipes for common setups.
Introduction
The .uversionignore file at the workspace root defines the files and folders the client
should never track, upload, or include in commits. .gitignore-style syntax
(a subset: comments, folder patterns ending in /, and name/extension globs),
compiled by globset. It is not
a full gitignore: negation with ! and anchoring are not supported. A few Unreal Engine specific
rules are documented below.
The file is created automatically by the desktop client at clone time with a default
UE5 template. You can edit it afterwards to fit your project.
The file is itself tracked: if you edit and commit it, your collaborators pick up your changes on their next sync. This is intentional: the whole studio shares the same exclusion rules.
Syntax
One rule per line. Empty lines and lines starting with # are ignored (comments).
Basic patterns
| Pattern | Effect |
|---|---|
foo.txt | Any file named foo.txt at any level of the tree |
foo/ | Every folder named foo and its contents, at any level (folder patterns always match at any depth) |
foo | Any file OR folder named foo at any level (no trailing slash) |
Wildcards
| Pattern | Effect |
|---|---|
*.tmp | All .tmp files at any level |
*.{tmp,bak,old} | Brace expansion: equivalent to *.tmp + *.bak + *.old |
foo* | Any file or folder whose name starts with foo |
?ile.txt | ? matches exactly one character: file.txt, pile.txt, etc. |
[abc].txt | Character class: a.txt, b.txt, c.txt |
**/build/ | Recursive: any build/ folder at any level (equivalent to build/) |
Content/**/Tmp/ | Recursive in the middle: any Tmp/ folder anywhere under Content/ |
Content/** | Everything under Content/, at any depth |
No negation (!)
Unlike .gitignore, uVersion does not support the ! prefix to
re-include a file. A line starting with ! is treated as a literal pattern, not as
an exception. Re-tracking files inside an ignored folder only happens through the automatic rules:
the ThirdParty carve-out and the whitelisting of Binaries/ for installed plugins (see below).
Comments
# Build artifacts (regénérés à chaque build, jamais à versioner)
Binaries/
Intermediate/
A # in the middle of a line is not a comment: it is part of the pattern. Only a # at the start of a line (after optional whitespace) starts a comment.
Rule precedence
The order of lines in the file does not matter: all patterns are compiled into
a single GlobSet and a path is ignored as soon as it matches any of them. The decision follows a fixed
precedence, in this order:
- Reserved path
Plugins/uVersion: always ignored (folder managed by the tool, binary distribution), even if a rule tried to include it. ThirdPartycomponent: if a path segment is named exactlyThirdParty, the file is never ignored.- Whitelisted plugin prefix (
Binaries/of an installed plugin): never ignored. - Otherwise: the path is ignored if it matches a pattern from the file.
Default UE5 template
Here is exactly what the desktop client generates at clone time in a UE5 workspace:
# uVersion ignore - Unreal Engine 5 defaults
# Note: Installed plugins, ThirdParty directories, and plugins with
# external library dependencies are automatically whitelisted.
# Build & intermediate (regenerated by UE5)
Binaries/
Build/
DerivedDataCache/
Intermediate/
Packages/
Saved/
# IDE / editor
.vs/
.vscode/
.idea/
.vsconfig
*.sln
*.suo
*.sdf
*.opensdf
*.opendb
*.ncb
*.user
# Build artifacts
*.pdb
*.obj
*.o
*.lib
*.dll
*.so
*.dylib
*.exe
*.exp
*.ilk
*.iobj
*.ipdb
*.pch
*.ipch
*.res
*.tlog
*.manifest
# Logs & temp
*.log
*.tmp
*.bak
*.swp
# OS files
Thumbs.db
.DS_Store
desktop.ini
You can add your own rules to this file. Remember to commit it so the whole studio has the same exclusions.
Plugins
Reserved folder Plugins/uVersion
The Plugins/uVersion folder (the uVersion plugin itself) is always ignored, at
any depth, and this rule wins over everything else. It is managed by the desktop client
(binary distribution) and must never be committed. Neighbouring folders like Plugins/uVersionExtras
are not affected.
uVersion also applies smart logic for other plugins, with nothing to write in the file:
- If a plugin has
"Installed": truein its.upluginand has noSource/folder (purely binary plugin, Marketplace style) → itsBinaries/are whitelisted, and therefore tracked. This is correct: for a binary plugin, the compiled.dllfiles are the plugin. - If the plugin has a
Source/folder (recompilable) or does not have"Installed": true→ itsBinaries/andIntermediate/are ignored just like the main project (binaries are artifacts regenerated at build time).
This logic avoids having to manually maintain exceptions for commercial plugins downloaded from the Epic Marketplace. A studio can mix source plugins and binary plugins without configuring anything.
ThirdParty folder
Any path containing ThirdParty/ is always tracked, even if a parent rule would ignore it.
This follows the Unreal convention: ThirdParty/ typically holds precompiled libs (.lib,
.dll, .so, .a) that the project needs to compile.
Plugins/MyPlugin/Source/ThirdParty/SomeLib/lib/Win64/SomeLib.lib
Even if you write **/lib/ or *.lib in your .uversionignore, this file
stays tracked thanks to the implicit ThirdParty/ rule.
ThirdParty/ subtree (rare), use an explicit
rule. But first ask yourself why you want to exclude build dependencies from the repo: the project
may no longer compile for your teammates.
Common recipes
Project with external art source (Maya, Blender, ZBrush)
If your art sources (.blend, .mb, .zpr) live next to the UE project, you want to track them but perhaps not their caches:
# Sources d'art (à versionner)
ArtSource/
# Mais pas les caches Blender / Maya
**/blendcache_*/
**/cache/
**/temp/
**/*.blend1
**/*.mb~
Project with several test maps you don't want to commit
# Maps de test temporaires (chacun les sien sur son disque)
Content/Maps/Test_*.umap
Content/Maps/Test_*.uasset
Track a specific binary despite a generic rule
Since negation ! does not exist, you cannot globally exclude *.exe/*.dll
then re-include one binary. Instead, place your throwaway artifacts under an ignored folder (e.g.
Intermediate/) and keep the tool you want to track outside the exclusion patterns. Unreal alternative:
build libs belong in ThirdParty/, which is always tracked automatically.
Ignore personal notes
# Chacun ses notes
notes.md
TODO.txt
.scratch/
Multi-platform project with intermediate packages
# Packagés (publish via le client, pas dans le repo)
Packages/
Saved/StagedBuilds/
# Caches de cook par plateforme
Saved/Cooked/
Build/Win64/
Build/Mac/
Build/Linux/
Testing a file
To check whether a path will be ignored by the client before you commit, use the CLI:
$ uversion status MaybeIgnored/File.uasset
# Si le fichier apparaît dans la sortie → il est tracké
# S'il n'apparaît pas (et qu'il existe sur disque) → il est ignoré
Or, more directly, in JSON mode with a jq filter:
$ uversion status --json | jq '.files[] | select(.path == "MaybeIgnored/File.uasset")'
Common pitfalls
Trailing slash = folder, no slash = ambiguous
foo ignores both the file foo and the folder foo/.
foo/ ignores only the folder. If you want to be precise, add the trailing slash for folders.
Case sensitive
Patterns are case sensitive. Content/ does not match content/.
Since Windows is case-insensitive on the FS side, you can end up with silent collisions if
one dev on Windows names it Content/ and another content/. Standardize on Content/.
No re-inclusion (!)
Writing !Saved/Config/Foo.ini re-includes nothing: negation is not supported, the line is taken
as a literal pattern. To keep a subfolder, only ignore the subtrees you want to exclude (e.g.
Saved/Logs/, Saved/Backup/) instead of all of Saved/.
Patterns that are too broad
*.zip ignores every .zip in the workspace, including game assets deliberately named
.zip (rare, but it happens in adventure games / data files). Prefer more specific patterns:
dist/*.zip, Releases/*.zip, etc.
Editing .uversionignore does not affect already-committed files
Like git, adding a pattern to .uversionignore does not make already-tracked files disappear.
You have to remove them explicitly through the desktop client (Mark for delete + checkin) if you want to
take them out of the repo.