lingo pull

Max PrilutskiyCEO 兼联合创始人预计阅读 1 分钟

获取最近一次 push 的输出结果并写入磁盘,同时基于 lockfile 进行冲突检测。

text
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 会直接报错:

text
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 会中止:

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 lrg_a8c...: wrote 12 file(s), 4 already in sync.

试运行:

text
Dry run complete. 16 file(s) already in sync.

运行失败或已取消:

text
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。