获取最近一次 push 的输出结果并写入磁盘,同时基于 lockfile 进行冲突检测。
text
lingo pull [--force] [--dry-run]适用场景#
lingo push 会在运行完成后直接写入输出——所以只有在你没有(或无法)同步等待时,pull 才派得上用场:
- 翻译过程中关掉了终端。 重新打开后运行
lingo pull——它会从上次运行停下的地方接着继续。 - 在另一台机器上拉取。 译者在自己的笔记本上运行
push;CI / 团队成员在相同的检出目录、相同的引擎和相同的凭据下运行pull,就能拿到输出结果。 - 运行已完成,但
push还没来得及写入时又恢复了工作。 比如网络短暂抖动、进程被杀掉——pull可以把剩下的工作补完。
如何定位这次运行#
pull 会读取 ~/.lingo/runs/<hash>.json,其中 <hash> 是根据项目根目录的绝对路径推导出来的。这个文件会记录来自 push 的最近一次 runId。如果没有它,pull 会直接报错:
text
Error: No run state at ~/.lingo/runs/<hash>.json — run `lingo push` first so we
know which run's outputs to pull.这个文件按机器区分,存放在仓库之外(原因详见 Configuration)。
冲突检测#
在写入每个目标文件之前,pull 会比较:
- 磁盘上的本地文件 哈希值
- 记录在
.lingo/lock.json中、作为最近一次已知服务器版本的哈希值
如果两者一致 → 说明本地没有修改,可以安全覆盖。如果两者不同 → 说明本地存在修改;执行 pull 会丢失这些改动。此时 pull 会中止:
text
Error: 3 conflict(s) — rerun with --force这里唯一的事实来源是 lockfile——它记录的是服务器上次写入的内容,而不是源文件内容。对于你希望保留的译文文件手动修改,要么提交到版本控制中(这样它们就不会被 pull 覆盖),要么用 --force 拉取(这样它们会被覆盖)。
参数#
--force / -f#
覆盖那些相对于 lockfile 已发生偏离的本地目标文件。请在你审查完冲突并确认应以服务器版本为准后再使用(例如,其他人推送了应优先采用的术语表更新)。
推荐工作流:
bash
git status # stash or commit local edits first
git stash # if you want to keep them aside
lingo pull --force
git stash pop # re-apply your edits, resolve conflicts manually--dry-run#
显示 pull 会执行哪些操作,但不会实际改动文件系统:
bash
lingo pull --dry-run会输出将要写入的文件数量,以及其中已有多少文件处于同步状态。这在 CI 中很实用,可用于断言没有任何内容发生漂移。
输出#
成功:
text
✓ Pulled run run_a8c...: wrote 12 file(s), 4 already in sync.试运行:
text
Dry run complete. 16 file(s) already in sync.运行尚未完成:
text
Run run_a8c... is running, not pulling yet.(pull 不会阻塞等待仍在进行中的运行——稍后再重新执行即可,或者下次改用会等待完成的 push。)
边界情况#
- 此前没有 push。 会像上面一样报错。这里不存在“拉取服务器上某处已有的翻译”这种概念——
pull始终针对某一次特定运行。 - 运行状态指向一个已删除或已过期的运行。 引擎会返回 404;
pull会清楚地报告这个问题。删除~/.lingo/runs/<hash>.json,然后重新运行push。 .lingo/config.json中使用的引擎与创建该运行时使用的引擎不同。 这会导致引擎 ID 不匹配——CLI 会在报错信息中显示相关 ID。请针对当前引擎重新运行push。
