Wiki
CLI uversion
Полный справочник по CLI uVersion: все команды, флаги, примеры, JSON output, коды выхода.
Двоичный файл uversion покрывает те же операции контроля версий, что и десктопный
клиент, а вдобавок даёт пригодный для обработки программой вывод --json, для
автоматизации: непрерывная интеграция, скрипты онбординга, собственные инструменты. Эта страница
предназначена для разработчиков и администраторов студий.
Установка
В Windows двоичный файл uversion.exe входит в установщик десктопного
клиента и автоматически добавляется в пользовательский PATH
(%LOCALAPPDATA%\uVersion). Запись PATH дедуплицируется при каждом обновлении и
удаляется при деинсталляции. Откройте новый терминал и введите:
uversion --help
В macOS это происходит автоматически: при первом запуске десктопный клиент создаёт
ссылку на встроенный двоичный файл в ~/.local/bin/uversion и убеждается, что эта папка
находится в PATH (через ~/.zprofile). Запустите приложение один раз, откройте
новый терминал, и команда uversion станет доступна. Чтобы сделать это
вручную в другое место PATH:
ln -s /Applications/uVersion.app/Contents/Resources/uversion /usr/local/bin/uversion
В Linux это тоже происходит автоматически, ровно как в macOS. Десктопный клиент
распространяется как AppImage, и этот AppImage содержит двоичный файл
uversion. При первом запуске приложение помещает его в
~/.local/bin/uversion и убеждается, что эта папка находится в PATH. Запустите
приложение один раз, откройте новый терминал, и команда станет доступна:
uversion --help
Вам ничего не нужно компилировать. В Linux десктопный клиент распространяется только как AppImage,
и именно он приносит CLI. Чтобы поместить двоичный файл в другое место PATH, скопируйте его из
~/.local/bin:
sudo cp ~/.local/bin/uversion /usr/local/bin/uversion
Чтобы проверить установленную версию:
$ uversion --version
Шпаргалка: все команды
Весь набор доступных команд, в порядке, в котором с ними обычно сталкиваются:
| Команда | Что она делает |
|---|---|
uversion login <url> -u <user> | Аутентифицироваться на сервере |
uversion logout | Стереть сохранённые учётные данные |
uversion repos | Перечислить доступные репозитории |
uversion clone <repo> [path] | Клонировать репозиторий |
uversion info | Показать состояние workspace + текущего пользователя |
uversion status [paths...] | Посмотреть изменённые / новые / удалённые / заблокированные файлы |
uversion checkout <paths...> | Зарезервировать файлы для редактирования (ставит блокировку) |
uversion checkin <paths...> -m "..." | Загрузить и зафиксировать изменения |
uversion revert <paths...> | Отменить локальные изменения и снять блокировки |
uversion sync | Получить изменения с сервера (весь репозиторий) |
uversion content <path> --revision <n> | Скачать конкретную версию файла |
uversion log | История коммитов |
uversion lock list | Посмотреть все блокировки репозитория |
uversion lock release <paths...> | Снять блокировку, не трогая файл |
uversion lock heartbeat | Сообщить, что ваши блокировки ещё используются (для мониторинга) |
uversion trust <url> | Запомнить отпечаток самоподписанного сертификата сервера (интерактивно; --yes для скриптов) |
uversion mistrust <url> | Забыть запомненный отпечаток сервера |
uversion trusted | Перечислить серверы, чей отпечаток запомнен |
Все команды, кроме uversion content, принимают --json, который заменяет
читаемое отображение на пригодный для обработки программой вывод (см.
JSON output). Все принимают --help для подробностей об
опциях.
checkout, checkin и revert также принимают
--paths-file <fichier>, незаменимый, как только работаешь в масштабе
проекта Unreal. См. Объёмные списки путей.
Аутентификация
uversion login
Аутентифицируется на сервере uVersion. Сервер выдаёт токен сессии (JWT, от JSON Web Token), который CLI помещает в менеджер паролей системы: Диспетчер учётных данных в Windows, Связку ключей в macOS, libsecret в Linux. Этот токен разделяется с десктопным клиентом, плагином Unreal и плагином Rider: вход с одной стороны выполняет вход и на других, а выход отключает их все.
uversion login <url_serveur> -u <utilisateur> [-p <mot_de_passe>]
| Опция | Описание |
|---|---|
-u, --username | Имя пользователя |
-p, --password | Не рекомендуется. См. врезку ниже. Если опция опущена, CLI читает переменную окружения UVERSION_PASSWORD, а при её отсутствии запрашивает пароль интерактивно, без отображения на экране. |
UVERSION_PASSWORD, никогда не -p
В многопользовательской системе командная строка каждого процесса доступна для чтения другим
учётным записям машины: ps в Linux и macOS, Диспетчер задач или wmic в
Windows. Пароль, переданный как аргумент, появляется там в открытом виде, даже если он приходит из
переменной, поскольку оболочка заменяет её на её значение до запуска программы. Он также
попадает в историю оболочки и часто в журналы цепочки непрерывной интеграции.
CLI читает UVERSION_PASSWORD именно чтобы этого избежать, и выводит предупреждение в
стандартный поток ошибок, когда используется -p.
Примеры:
$ uversion login https://uversion.mygamestudio.com -u alice
Password:
Logged in as alice (artist)
# Sur un serveur de studio, en interne. Le port par défaut est 8443, en HTTPS.
$ uversion login https://192.168.1.100:8443 -u bob
Password:
Logged in as bob (programmer)
# Compte d'intégration continue : le mot de passe passe par l'environnement,
# jamais par la ligne de commande.
$ export UVERSION_PASSWORD="$SECRET_FROM_VAULT"
$ uversion login "$UV_SERVER" -u ci-nightly
Logged in as ci-nightly (programmer)
При первом подключении к серверу, предъявляющему самоподписанный сертификат, CLI показывает
отпечаток сертификата и просит вас его подтвердить, затем запоминает его. Это принцип
доверия при первом контакте, тот же, что и в SSH: личность принимается один раз, и
всякое последующее предъявление другой личности сигнализируется. Если отпечаток меняется, CLI
отклоняет подключение и предупреждает вас: это либо законное обновление сертификата, либо
перехват вашего трафика третьей стороной. Сознательное действие тогда —
uversion mistrust <url>, а затем новое подключение.
uversion logout
Стирает токен из менеджера паролей системы и на стороне сервера аннулирует все сессии этой учётной записи. Поскольку токен разделяется, это также отключает десктопный клиент, плагин Unreal и плагин Rider, на всех ваших машинах.
$ uversion logout
Logged out (alice)
$ uversion logout # si aucune session n'était ouverte
Already logged out
Какая учётная запись действует? Учётная запись workspace, а не последняя вошедшая
Это момент, который удивляет больше всего, и его лучше знать до того, как что-либо автоматизировать: используемая личность — не личность последнего входа, а личность workspace, в котором вы находитесь.
Workspace — это клонированная папка, распознаваемая по её подпапке .uversion. Файл
.uversion/config.toml в ней записывает сервер и учётную запись-владельца:
[repository]
id = "1"
name = "hero-rpg"
server_url = "https://uversion.mygamestudio.com"
[workspace]
id = "..."
name = "alice-cli"
owner = "alice"
last_synced_revision = 42
Как только вы в workspace, server_url и owner обладают приоритетом:
status, checkout, checkin, revert,
sync, log, content, lock и info
аутентифицируются как owner, на server_url.
Только login, logout, repos и
clone используют конфигурацию, разделяемую между всеми workspace (в Windows
%APPDATA%/uversion/uVersion/config/config.toml), которая следует за активной учётной
записью десктопного клиента.
Почему. Одна и та же машина часто служит нескольким учётным записям, например
фрилансеру, работающему на две студии. Без этого правила все workspace действовали бы под активной
в данный момент учётной записью: папка, клонированная alice, но используемая, пока
активен bob, ставила бы свои блокировки от имени bob, видела бы
собственные файлы как «заблокированные кем-то другим» и получала бы отказ в своих отправках.
Чтобы сменить личность workspace, отредактируйте поле owner в
.uversion/config.toml и убедитесь, что эта учётная запись хотя бы раз входила на этой
машине (uversion login), чтобы её токен присутствовал. Затем проверьте с помощью
uversion info, который показывает реально используемую учётную запись.
Токен хранится под одним лишь именем пользователя, без сервера. Если одно и то же имя существует на двух разных серверах uVersion, оба разделяют одну и ту же запись: вход на второй заменяет токен первого. Используйте разные имена или задействуйте только один сервер за раз с одной машины.
Репозитории
uversion repos
Перечисляет репозитории, к которым у учётной записи есть доступ. Эта команда использует общую конфигурацию, а не конфигурацию workspace: поэтому она отвечает за учётную запись вашего последнего входа.
$ uversion repos
ID Name Description
----------------------------------------------------------------------
1 hero-rpg Main RPG project
2 shared-assets Shared asset library
12 prototype-fps R&D prototype FPS
$ uversion repos # si aucun dépôt n'est accessible
No repositories found
uversion clone
Получает репозиторий локально. Если путь опущен, в текущем каталоге создаётся папка с именем
репозитория. Клон также создаёт подпапку .uversion, которая делает папку workspace и
записывает сервер и учётную запись-владельца.
Передача применяет дедупликацию: содержимое разбивается на блоки, и уже присутствующий блок сохраняется лишь один раз, даже если он встречается в нескольких файлах. Вот почему занятое на диске место часто заметно меньше скачанного объёма.
uversion clone <repo_name_or_id> [local_path]
Примеры:
$ uversion clone hero-rpg
Cloning hero-rpg to ./hero-rpg...
✓ 8,432 files in 47s (14.2 GB downloaded, 6.1 GB on disk after dedup)
$ uversion clone hero-rpg D:\Projects\HeroRPG
$ uversion clone 1 # par ID au lieu du nom
Файлы
uversion status
Показывает состояние файлов текущего workspace: изменённые, новые (untracked), удалённые, заблокированные другими.
uversion status [paths...] [--json]
Примеры:
$ uversion status
Modified:
M Content/Maps/MainLevel.umap (locked by alice)
New:
A Content/Textures/NewTexture.png
Deleted:
D Content/OldAsset.uasset
Locked by others:
L Content/Characters/Hero.uasset (locked by bob)
1 modified, 1 new, 1 deleted, 1 locked by others
$ uversion status Content/Maps # filtre par dossier
$ uversion status --json | jq '.summary' # extraction scriptable
uversion checkout
Ставит исключительную блокировку на указанные файлы и делает их изменяемыми на диске. Отслеживаемые файлы доступны только для чтения, пока не зарезервированы: именно это не даёт двум людям редактировать один и тот же бинарный ассет параллельно.
uversion checkout <paths...> [--paths-file <fichier>] [--force] [--add] [--json]
| Опция | Описание |
|---|---|
--paths-file | Читать дополнительные пути из файла, по одному на строку. См. Объёмные списки путей. |
--force | Забирает блокировку, даже если её удерживает кто-то другой. Доступно только учётным записям, обладающим возможностью force_unlock, то есть ролям admin и lead. См. ниже. |
--add | Разрешает резервирование путей, ещё отсутствующих локально, для новых файлов. |
--force
Опция забирает чужую блокировку. Она защищена возможностью force_unlock, которой
обладают роли admin и lead. Учётная запись, у которой её нет, получает
явный отказ, с указанием способа действий: попросить администратора или
воспользоваться кнопкой «Запросить снятие» десктопного клиента, которая уведомляет
затронутого человека.
Когда захват действительно произошёл, он заносится в журнал аудита, с затронутыми путями и именами людей, у которых были забраны блокировки. Ничего не записывается, если опция присутствовала, но ни одна чужая блокировка не сменила владельца: в скриптах флаг часто ставится систематически, а журнал, полный беспредметных событий, — это журнал, который никто не перечитывает.
Примеры:
$ uversion checkout Content/Maps/MainLevel.umap
✓ Lock acquired: Content/Maps/MainLevel.umap
$ uversion checkout Content/Characters/Hero.uasset Content/Characters/Villain.uasset
✓ Lock acquired: Content/Characters/Hero.uasset
✓ Lock acquired: Content/Characters/Villain.uasset
# Fichier déjà réservé par bob
$ uversion checkout Content/Maps/MainLevel.umap
✗ File is locked (bob)
# Compte sans la capacité force_unlock
$ uversion checkout --force Content/Maps/MainLevel.umap
Error: Taking a lock held by another user requires the force_unlock capability
(admin or lead). Ask an administrator, or use Request Release to ask the holder.
# Compte admin ou lead : le vol passe, et il est tracé
$ uversion checkout --force Content/Maps/MainLevel.umap
✓ Lock acquired: Content/Maps/MainLevel.umap
uversion checkin
Загружает изменённые файлы и фиксирует их на сервере в одной транзакции: либо проходит всё, либо ничего. Блокировки автоматически снимаются в случае успеха.
uversion checkin [paths...] [--paths-file <fichier>] -m <message> [--all] [--json]
| Опция | Описание |
|---|---|
-m, --message | Сообщение коммита. Обязательно. |
-a, --all | Включить все изменённые файлы workspace, а не только переданные как аргумент. |
--paths-file | Читать дополнительные пути из файла, по одному на строку. См. Объёмные списки путей. |
Примеры:
$ uversion checkin Content/Maps/MainLevel.umap -m "Fixed lighting in main level"
Validating 1 file...
✓ All validation rules passed
Uploading: [####################] 100% · 84 MB
✓ Committed as 7f3a9b1 (1 file, 84 MB uploaded, 0 deduped)
$ uversion checkin --all -m "Weekly art update" # tout le workspace
$ uversion checkin Content/Characters/ -m "Updated character meshes"
uversion revert
Отменяет локальные изменения одного или нескольких файлов, восстанавливает версию сервера и снимает соответствующие блокировки.
uversion revert <paths...> [--paths-file <fichier>] [--json]
Примеры:
$ uversion revert Content/Maps/MainLevel.umap
✓ Reverted: Content/Maps/MainLevel.umap (lock released)
$ uversion revert Content/Characters/ # récursif par dossier
Объёмные списки путей: --paths-file
checkout, checkin и revert принимают
--paths-file <fichier>: текстовый файл, содержащий по одному пути на
строку. Прочитанные так пути добавляются к переданным как аргумент, а не заменяют их.
Для чего это нужно. В проекте Unreal операция обычно затрагивает несколько тысяч
файлов. Передать их все как аргументы упирается в ограничение системы: в Windows командная строка не
может превышать 32 767 символов, что составляет около 500 путей к ассетам. Сверх этого команда
падает ещё до запуска, с сообщением об ошибке системы, которое ничего не говорит о реальной
проблеме. --paths-file снимает это ограничение: файл может содержать их столько,
сколько нужно.
Зарезервировать все изменённые файлы папки, каким бы ни было их количество:
$ uversion status --json \
| jq -r '.files[] | select(.status == "modified") | .path' > /tmp/changed.txt
$ wc -l /tmp/changed.txt
3184 /tmp/changed.txt
$ uversion checkout --paths-file /tmp/changed.txt
Затем отправить ровно ту же партию:
$ uversion checkin --paths-file /tmp/changed.txt -m "Import de la passe d'éclairage"
В Windows, в PowerShell:
PS> (uversion status --json | ConvertFrom-Json).files |
Where-Object { $_.status -eq "modified" } |
ForEach-Object { $_.path } |
Set-Content -Encoding utf8 changed.txt
PS> uversion checkout --paths-file changed.txt
Это также механизм, который применяет плагин Rider для передачи объёмного набора изменений.
uversion sync
Скачивает последние изменения с сервера и применяет их к локальному workspace.
uversion sync [--force] [--json]
| Флаг | Описание |
|---|---|
-f, --force | Полный sync: заново скачивает все файлы, а не только дельту с последнего sync. Полезно при повреждённом workspace. |
Примеры:
$ uversion sync
Syncing from revision 41 → 47...
✓ 12 files updated, 3 added, 1 deleted (1.4 GB downloaded)
$ uversion sync --force # re-télécharge tout
uversion content
Скачивает конкретную версию файла, не трогая локальный workspace. Полезно для сравнения,
архивирования или получения прошлого состояния без выполнения revert.
uversion content <path> [-r <numéro_de_révision>] [-o <fichier>]
--revision ожидает целое число, а не отпечаток коммита
Это номер ревизии файла: счётчик, равный 1 у его первой версии, 2 у второй, и так
далее. Передача отпечатка коммита вроде 6e2b8a0 приводит к сбою команды уже на этапе
разбора аргументов.
Номер читается в uversion log --path <fichier>, где каждая строка файла
показывает его в скобках. Пропуск --revision скачивает последнюю версию.
Примеры:
$ uversion content Content/Maps/MainLevel.umap --revision 12 --output ./snapshot.umap
$ uversion content Content/Characters/Hero.uasset -r 8 -o ./hero-v8.uasset
# Sans --output, le contenu est écrit sur la sortie standard
$ uversion content Config/DefaultEngine.ini -r 3 > DefaultEngine-v3.ini
История
uversion log
История коммитов текущего репозитория, опционально отфильтрованная по файлу.
uversion log [-n <limit>] [-p <path>] [--json]
| Флаг | Описание |
|---|---|
-n, --limit | Число записей для отображения (по умолчанию: 20) |
-p, --path | Фильтр по пути файла |
Примеры:
$ uversion log
commit 7f3a9b1c2d...
Author: alice
Date: 2026-05-15 08:30:00 UTC
Fixed lighting in main level
Content/Maps/MainLevel.umap (rev 12)
commit 6e2b8a0...
Author: bob
Date: 2026-05-14 17:22:00 UTC
Hero pose pass
Content/Characters/Hero.uasset (rev 8)
Content/Characters/OldHero.uasset (deleted, rev 9)
$ uversion log -n 5 # 5 derniers commits
$ uversion log --path Content/Maps/MainLevel.umap # historique d'un fichier
Строка, помеченная deleted, — это ревизия удаления: она несёт номер, как и остальные,
но не имеет содержимого для скачивания.
Блокировки
Она держится, пока не будет явно снята: через uversion checkin, через
uversion revert, через uversion lock release или через принудительное
снятие администратором. Никакого автоматического истечения не существует, ни
через час, ни через месяц. Зарезервированный и забытый файл остаётся таким, пока кто-нибудь не
вмешается.
Следовательно, uversion lock heartbeat ничего не продлевает. Эта
команда лишь говорит «эти блокировки мне ещё нужны», чтобы администраторы отличали активную
блокировку от заброшенной.
uversion lock list
Показывает все блокировки текущего репозитория.
uversion lock list [--json]
Примеры:
$ uversion lock list
File User Acquired
----------------------------------------------------------------------
Content/Maps/MainLevel.umap alice 2026-05-15T08:42:11Z
Content/Characters/Hero.uasset bob 2026-05-14T17:00:00Z
Content/UI/HUD.uasset alice 2026-05-15T09:15:00Z
Если показывать нечего, команда пишет No active locks.
uversion lock release
Снимает одну или несколько блокировок, не трогая локальное содержимое файла. Используется, чтобы «вернуть» ассет, который не изменяли: зарезервированный по ошибке или брошенная без отправки работа.
uversion lock release <paths...> [--json]
Примеры:
$ uversion lock release Content/Maps/MainLevel.umap
✓ Lock released: Content/Maps/MainLevel.umap
Эта команда снимает только ваши собственные блокировки. Чтобы снять чужую, нужно
пройти через администрирование, или через uversion checkout --force, если вы
admin или lead.
uversion lock heartbeat
Сообщает, что блокировки, удерживаемые текущей учётной записью, ещё используются. Это их не продлевает: ничто не истекает. Это сигнал для мониторинга, чтобы администратор, просматривающий список блокировок, видел, какие из них ещё активны. В повседневной работе не нужен; полезен для автоматизированной обработки, которая держит файл зарезервированным часами.
$ uversion lock heartbeat
3 lock(s) extended
$ uversion lock heartbeat # si vous ne détenez aucun verrou
No locks to extend
Пример в непрерывной интеграции:
$ while build_in_progress; do
uversion lock heartbeat
sleep 300
done
Информация
uversion info
Показывает используемую учётную запись и состояние текущего workspace. Это команда, которую нужно запускать первой, когда что-то ведёт себя неожиданно: она показывает, под какой личностью CLI действует на самом деле, а это личность владельца workspace, а не обязательно вашего последнего входа (см. Какая учётная запись действует?).
$ uversion info
User: alice (lead)
Repository: hero-rpg (id: 1)
Server: https://uversion.mygamestudio.com
Workspace: alice-cli (3f2a1c8e-...)
Local path: D:\Projects\HeroRPG
Last sync: revision 42
Вне workspace или без действительной сессии:
$ uversion info
User: not logged in
Workspace: not in a uVersion workspace
Команда не считает файлы и не показывает сводку изменений: это роль uversion status.
JSON output
Все команды, кроме content, принимают --json, который заменяет читаемое
отображение на структурированный вывод. Именно это делает CLI пригодным для скриптов.
log, lock list и repos напрямую производят
JSON-массив, без обёртывающего объекта. Поэтому нет ни ключа commits,
ни ключа locks, ни ключа repositories: в jq нужно писать
.[], а не .commits[]. Выражение, нацеленное на несуществующий ключ, не
производит ничего вообще, без сообщения об ошибке.
Пример: uversion status --json
{
"files": [
{
"path": "Content/Maps/MainLevel.umap",
"status": "locked",
"locked_by": "alice",
"is_owned": true,
"version": 12
},
{
"path": "Content/Textures/NewTexture.png",
"status": "new",
"locked_by": null,
"is_owned": false,
"version": 0
}
],
"summary": {
"modified": 1,
"new": 1,
"deleted": 0,
"locked_by_others": 0
}
}
Возможные значения status:
| Значение | Смысл |
|---|---|
modified | Файл изменяем на диске, без поставленной блокировки |
locked | Зарезервирован вами |
locked_other | Зарезервирован кем-то другим, названным в locked_by |
new | Присутствует локально, неизвестен серверу |
deleted | Присутствует на сервере, отсутствует локально |
tracked | Отслеживается и цел. Появляется только если вы отфильтровали по пути |
Обратите внимание, что summary.modified суммирует modified и
locked, поскольку оба обозначают файл, над которым вы работаете.
Пример: uversion log --json -n 1
[
{
"commit_hash": "7f3a9b1c2d...",
"message": "Fixed lighting in main level",
"author": "alice",
"created_at": "2026-05-15T08:30:00Z",
"files": [
{
"path": "Content/Maps/MainLevel.umap",
"revision_number": 12,
"file_size": 84934656,
"is_delete": false
}
]
}
]
Пример: uversion lock list --json
[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"file_id": 12345,
"file_path": "Content/Maps/MainLevel.umap",
"user_id": 12,
"username": "alice",
"acquired_at": "2026-05-15T08:42:11Z",
"expires_at": "2126-05-15T08:42:11Z"
}
]
Срок в 2126 году — не опечатка: столбец не может оставаться пустым в базе данных, поэтому сервер пишет туда значение, отодвинутое на сто лет вперёд. Блокировки не истекают. Не показывайте это поле пользователю и ничего на нём не стройте.
Обработка ошибок
В случае сбоя CLI пишет Error: <message> в стандартный поток
ошибок и завершается с кодом 1. Ошибки никогда не выводятся в JSON в стандартный поток
вывода: с --json структурирован только результат успеха. В скрипте проверяйте код
выхода, а не содержимое вывода.
Типичные сценарии
Онбординг нового члена команды
uversion login https://uversion.mygamestudio.com -u newdev
uversion repos # confirme l'accès
uversion clone hero-rpg ~/Projects/HeroRPG # download initial
Ежедневный рабочий процесс (artist / programmer)
# Début de journée
uversion sync
# Avant d'éditer
uversion checkout Content/Maps/MainLevel.umap
# ... édition dans Unreal Editor ou Rider ...
# Commit en fin de journée
uversion checkin --all -m "Updated main level + hero animations"
Скрипт аудита: кто что зарезервировал?
lock list --json возвращает массив в корне. Поэтому итерируем через .[], а
поля — username, file_path и acquired_at:
uversion lock list --json | jq -r '.[] | "\(.username)\t\(.file_path)\t\(.acquired_at)"'
Файлы, зарезервированные определённым человеком:
uversion lock list --json | jq -r '.[] | select(.username == "bob") | .file_path'
Извлечь отпечатки коммитов
Здесь массив тоже в корне, а поле называется commit_hash:
uversion log --json -n 50 | jq -r '.[].commit_hash'
Коммиты одного человека, с их сообщением:
uversion log --json -n 200 \
| jq -r '.[] | select(.author == "alice") | "\(.commit_hash[0:8]) \(.message)"'
Получить ассет на прошлой ревизии, не трогая workspace
uversion content ожидает номер ревизии, а не отпечаток коммита.
Найдите его в истории файла, где он показывается в скобках:
$ uversion log --path Content/Characters/Hero.uasset -n 10
commit 6e2b8a0...
Author: bob
Date: 2026-05-14 17:22:00 UTC
Hero pose pass
Content/Characters/Hero.uasset (rev 8)
$ uversion content Content/Characters/Hero.uasset --revision 8 --output ~/backup/Hero-v8.uasset
Или за один раз, для последней ревизии файла:
REV=$(uversion log --json --path Content/Characters/Hero.uasset -n 1 \
| jq -r '.[0].files[] | select(.path == "Content/Characters/Hero.uasset") | .revision_number')
uversion content Content/Characters/Hero.uasset --revision "$REV" --output ./Hero.uasset
Ночная сборка в непрерывной интеграции
Пароль проходит через UVERSION_PASSWORD, никогда через -p: командная
строка процесса доступна для чтения другим учётным записям машины.
export UVERSION_PASSWORD="$SECRET_FROM_VAULT"
uversion login "$UV_SERVER" -u ci-nightly
unset UVERSION_PASSWORD
uversion clone hero-rpg ./project
cd project
uversion sync --json > sync.log
# Réserver un fichier pour la durée du cook, et signaler qu'il sert toujours
uversion checkout Content/Cooking/Distribution.uasset
( while pgrep RunUAT; do uversion lock heartbeat; sleep 300; done ) &
# ... build et cook ...
uversion lock release Content/Cooking/Distribution.uasset
Переменные окружения и коды выхода
Переменные окружения
| Переменная | Описание |
|---|---|
UVERSION_PASSWORD |
Пароль, используемый uversion login, когда опция -p отсутствует.
Это рекомендуемый способ автоматизировать вход: в отличие от аргумента
командной строки, переменная окружения не открыта для других учётных записей машины. Если она
пуста или отсутствует, CLI запрашивает пароль интерактивно.
|
RUST_LOG |
Подробность журналов, пишущихся в стандартный поток ошибок. Например
RUST_LOG=debug. Уровень по умолчанию: warn.
|
Никакая переменная UV_* не читается. Сервер и учётная запись берутся из
.uversion/config.toml, когда вы в workspace, и иначе из общей конфигурации (в Windows
%APPDATA%/uversion/uVersion/config/config.toml). Токен сессии берётся из менеджера
паролей системы. См. Какая учётная запись действует?.
Коды выхода
| Код | Значение |
|---|---|
0 | Успех. Это также код, возвращаемый --help и --version, которые не являются ошибками. |
1 | Любая ошибка приложения: аутентификация, права, сеть, сервер, запись на диск, вне workspace, конфликт, валидация. CLI не различает причины по коду выхода; подробности в стандартном потоке ошибок. |
2 | Ошибка разбора аргументов: неизвестная опция, отсутствующее значение, недопустимая подкоманда. |
Пример в shell-скрипте:
if ! uversion checkin --all -m "Nightly"; then
echo "Checkin failed, see stderr"
exit 1
fi