uVersion
简体中文
下载 →

Wiki

CLI uversion

uVersion CLI 完整参考:所有命令、标志、示例、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显示工作区状态与当前用户
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 以查看选项的详细信息。

checkoutcheckinrevert 还接受 --paths-file <fichier>,一旦按 Unreal 项目规模工作便不可或缺。 见大量路径列表

身份验证

uversion login

在 uVersion 服务器上进行身份验证。服务器返回一个会话令牌 (一个 JWT,即 JSON Web Token),CLI 会把它存入系统密码管理器: Windows 上的凭据管理器、macOS 上的钥匙串、Linux 上的 libsecret。此令牌与桌面客户端、Unreal 插件 和 Rider 插件共享:在一处登录会让其他各处也登录,登出则会让全部登出。

uversion login <url_serveur> -u <utilisateur> [-p <mot_de_passe>]
选项描述
-u, --username用户名
-p, --password不建议使用。见下方提示框。若省略此选项,CLI 会读取环境变量 UVERSION_PASSWORD,若仍无则以交互方式询问密码,屏幕上不回显。
要脚本化登录,请使用 UVERSION_PASSWORD,绝不要用 -p

在多用户系统上,每个进程的命令行都可被机器上的其他账户读取:Linux 和 macOS 上的 ps、 Windows 上的任务管理器或 wmic。以参数传入的密码会以明文出现在那里,即便它来自某个变量 也是如此,因为 shell 会在启动程序之前把变量替换为它的值。它还会进入 shell 历史, 并常常进入持续集成链路的日志。

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 会显示证书指纹并请你确认,然后将其记住。这就是 首次连接即信任(Trust On First Use)的原则,与 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

是哪个账户在操作?是工作区的账户,而非最后登录的那个

这是最令人意外的一点,在脚本化任何东西之前最好先了解它: 所用的身份不是最后一次登录的身份,而是你所在工作区的身份。

工作区就是一个克隆下来的文件夹,可通过它的 .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

只要你在一个工作区内,server_urlowner 就是权威: statuscheckoutcheckinrevertsynclogcontentlockinfo 都以 owner 的身份、对 server_url 进行验证。

只有 loginlogoutreposclone 使用在所有工作区之间共享的配置(Windows 上为 %APPDATA%/uversion/uVersion/config/config.toml),它跟随桌面客户端的活动账户。

为什么。同一台机器常常服务于多个账户,例如为两家工作室工作的自由职业者。若没有这条 规则,所有工作区都会以当下的活动账户运作:由 alice 克隆、却在 bob 处于活动 状态时使用的文件夹,会以 bob 的名义加锁,会把自己的文件看作"被别人锁定",并且其上传会被 拒绝。

要更改一个工作区的身份,编辑 .uversion/config.toml 中的 owner 字段,并确保该账户在这台机器上至少登录过一次(uversion login), 以便其令牌存在。随后用 uversion info 确认实际使用的账户。

已知限制:两台服务器上使用同一个用户名

令牌仅以用户名存储,不含服务器。如果同一个名字存在于两台不同的 uVersion 服务器上,二者会共享同一个 条目:登录第二台会覆盖第一台的令牌。请使用不同的名字,或在同一台机器上一次只使用一台服务器。

仓库

uversion repos

列出该账户有权访问的仓库。此命令使用共享配置,而非某个工作区的配置:因此它针对你最后一次登录的账户 作出响应。

$ 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 子文件夹,它使该文件夹成为一个工作区,并记录服务器和所有者账户。

传输会应用去重:内容被切分为块,已存在的块只存储一次,即便它出现在多个文件中也是 如此。这就是磁盘占用往往明显小于下载量的原因。

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

显示当前工作区文件的状态:已修改、新增(未跟踪)、已删除、被他人锁定。

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 能力的账户,即 adminlead 角色。见下文。
--add允许为新文件预留本地尚不存在的路径。
--force 究竟做了什么

该选项会夺取别人的锁。它由 force_unlock 能力守护,该能力由 adminlead 角色持有。没有它的账户会收到明确的拒绝,并附上可行的补救办法: 向管理员申请,或使用桌面客户端的"申请释放"按钮,它会通知相关人员。

当夺取确实发生时,会被记入审计日志,连同涉及的路径和被夺走锁的人的名字。如果选项 存在但并没有别人的锁易手,则什么都不会记录:在脚本中该标志常常是一贯加上的,而充满无谓事件的日志 是没人会去看的日志。

示例:

$ 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包含工作区中所有已修改的文件,而不仅是作为参数传入的那些。
--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

checkoutcheckinrevert 接受 --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

从服务器下载最新更改,并应用到本地工作区。

uversion sync [--force] [--json]
标志描述
-f, --force完整同步:重新下载所有文件,而不仅是自上次同步以来的增量。工作区损坏时有用。

示例:

$ 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

下载文件的某个特定版本而不触碰本地工作区。适用于比较、归档,或在不做 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

此命令只释放你自己的锁。要移除别人的锁,需要通过管理端,或者如果你是 adminlead,通过 uversion checkout --force

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

显示所用的账户以及当前工作区的状态。当有什么行为出乎意料时,这是首先要运行的命令:它显示 CLI 实际 以哪个身份操作,那是工作区所有者的身份,未必是你最后一次登录的身份(见 是哪个账户在操作?)。

$ 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

在工作区之外,或没有有效会话时:

$ uversion info
User: not logged in

Workspace: not in a uVersion workspace

此命令不统计文件,也不显示更改摘要:那是 uversion status 的职责。

JSON output

content 外的所有命令都接受 --json,它把可读的显示替换为结构化的输出。 正是这一点使 CLI 可被脚本化。

有几个命令在根部返回一个数组

loglock listrepos 直接产生一个 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 会把 modifiedlocked 相加,因为两者 都指你正在处理的文件。

示例: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 在根部返回一个数组。因此用 .[] 迭代,字段为 usernamefile_pathacquired_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)"'

取回过去某个修订的资产,而不触碰工作区

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 当没有 -p 选项时 uversion login 所用的密码。 这是自动化登录的推荐方式:与命令行参数不同,环境变量不会暴露给机器上的其他 账户。若它为空或不存在,CLI 会以交互方式询问密码。
RUST_LOG 日志详细程度,写到标准错误输出。例如 RUST_LOG=debug。默认级别:warn

不会读取任何 UV_* 变量。当你在一个工作区内时,服务器和账户来自 .uversion/config.toml,否则来自共享配置(Windows 上为 %APPDATA%/uversion/uVersion/config/config.toml)。会话令牌来自系统密码管理器。见 是哪个账户在操作?

退出码

含义
0成功。这也是 --help--version 返回的码,它们并非错误。
1任何应用层错误:身份验证、权限、网络、服务器、磁盘写入、工作区之外、冲突、校验。CLI 不通过退出码区分原因;详情在标准错误输出上。
2参数解析错误:未知选项、缺少值、无效子命令。

shell 脚本中的示例:

if ! uversion checkin --all -m "Nightly"; then
  echo "Checkin failed, see stderr"
  exit 1
fi