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