uVersion
English
Download →

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

PatternEffect
foo.txtAny 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)
fooAny file OR folder named foo at any level (no trailing slash)

Wildcards

PatternEffect
*.tmpAll .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].txtCharacter 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:

  1. Reserved path Plugins/uVersion: always ignored (folder managed by the tool, binary distribution), even if a rule tried to include it.
  2. ThirdParty component: if a path segment is named exactly ThirdParty, the file is never ignored.
  3. Whitelisted plugin prefix (Binaries/ of an installed plugin): never ignored.
  4. 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": true in its .uplugin and has no Source/ folder (purely binary plugin, Marketplace style) → its Binaries/ are whitelisted, and therefore tracked. This is correct: for a binary plugin, the compiled .dll files are the plugin.
  • If the plugin has a Source/ folder (recompilable) or does not have "Installed": true → its Binaries/ and Intermediate/ 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.

Explicit override If you really want to ignore a specific 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.