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, distributed as a binary), even if a rule tried to include it. ThirdPartysegment: if a path segment is named exactlyThirdParty, the file is never ignored. See ThirdParty folder.- Plugin prefix whitelisted by default (the
Binaries/of an installed plugin with no source code): never ignored. - Otherwise: the path is ignored if it matches one of the file's patterns.
The first three steps are final decisions: as soon as one of them applies, the next is not evaluated, and your patterns are not consulted at all. That is why you cannot "counter" one of them with a more specific rule.
Default UE5 template
Here is, line for line, what the desktop client writes at clone time in a
UE5 workspace. If you copy this block by hand into an existing project, copy it in full:
the "IDE" and "Linux project generation" sections are the ones most often forgotten, and
their absence lets project files that are regenerated at every build get tracked, which then end up
in conflict for everyone.
# 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
*.slnx
*.xcworkspace/
*.xcodeproj/
*.code-workspace
*.suo
*.sdf
*.opensdf
*.opendb
*.ncb
*.user
# Linux project generation (GenerateProjectFiles)
Makefile
.ignore
# 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 with a segment named ThirdParty is always tracked,
whatever rule would designate it. It is an Unreal convention:
ThirdParty holds the precompiled libraries (.lib,
.dll, .so, .a) that compiling the project needs. Excluding
them would break the build for all your teammates.
Plugins/MyPlugin/Source/ThirdParty/SomeLib/lib/Win64/SomeLib.lib
Even if you write **/lib/, *.lib or *.dll in your
.uversionignore, this file stays tracked.
This is not a matter of priority between rules, where the most specific one would win. The test
"does this path contain a ThirdParty segment?" is evaluated before any
reading of your patterns, and if it answers yes, the file is declared tracked and evaluation
stops there. Your rules are never consulted.
So there is no "explicit override" to exclude a ThirdParty
subtree: no rule, however specific, can achieve it. If you really must
set such a folder aside, the only way is to rename it or move it out of a
ThirdParty tree.
Only one thing outranks this exception: the reserved folder
Plugins/uVersion, which stays ignored even under ThirdParty.
ThirdParty
The comparison is on a whole path segment, not on a name prefix.
A folder named ThirdPartyLibs, ThirdParty_Old or
MyThirdParty is not concerned: its content is subject to your
rules like any other file, and a *.dll rule will exclude it.
It is a frequent source of surprise: Source/ThirdParty/Lib/x.dll is tracked,
Source/ThirdPartyLibs/Lib/x.dll is not. If you notice that a library
is not being sent, first check the exact spelling of the folder.
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.