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
以查看选项的详细信息。
checkout、checkin 和 revert 还接受
--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_url 和 owner 就是权威:
status、checkout、checkin、revert、
sync、log、content、lock 和 info
都以 owner 的身份、对 server_url 进行验证。
只有 login、logout、repos 和
clone 使用在所有工作区之间共享的配置(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 能力的账户,即 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 | 包含工作区中所有已修改的文件,而不仅是作为参数传入的那些。 |
--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
从服务器下载最新更改,并应用到本地工作区。
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
此命令只释放你自己的锁。要移除别人的锁,需要通过管理端,或者如果你是
admin 或 lead,通过 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 可被脚本化。
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)"'
取回过去某个修订的资产,而不触碰工作区
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