lingo pull

Обновлено: 3 дня назад · 3 мин чтения

Получает результаты последнего push и записывает их на диск, проверяя конфликты по lockfile.

text
lingo pull [--force] [--dry-run]

Когда использовать#

lingo push завершает работу сразу после отправки запуска, поэтому pull — именно так вы забираете его результаты. Запускайте после любого пуша без --wait — и когда пуш с --wait не успел их записать:

  • Закрыли терминал прямо во время перевода. Откройте его снова и запустите lingo pull — команда подхватит процесс с того места, где остановился запуск.
  • Позже в том же CI-задании. Один шаг запускает lingo push, следующий шаг на том же раннере и чекауте запускает 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) или выполнить pull с --force (тогда они будут перезаписаны).

Флаги#

--force / -f#

Перезаписывает локальные целевые файлы, которые разошлись с lockfile. Используйте после того, как проверили конфликты и решили, что версия на сервере — каноническая (например, если кто-то другой отправил push с обновлением глоссария, которому нужно отдать приоритет).

Рекомендуемый рабочий процесс:

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 для текущего движка.