Получает результаты последнего push и записывает их на диск, проверяя конфликты по lockfile.
lingo pull [--force] [--dry-run]Когда использовать#
lingo push и так записывает результаты после завершения запуска, поэтому pull нужен только в случаях, когда вы не стали или не смогли ждать синхронно:
- Закрыли терминал прямо во время перевода. Откройте его снова и запустите
lingo pull— команда подхватит процесс с того места, где остановился запуск. - Делаете pull с другой машины. Переводчик запускает
pushна своём ноутбуке; CI или коллега запускаетpullв той же checkout-копии, с тем же движком и теми же учётными данными — и получает результаты. - Вернулись к работе уже после завершения запуска, но до того, как
pushуспела записать результаты. Сбой сети, принудительное завершение процесса —pullдоведёт дело до конца.
Как команда находит запуск#
pull читает ~/.lingo/runs/<hash>.json, где <hash> вычисляется на основе абсолютного пути к корню проекта. В этом файле хранится последний runId из push. Без него pull завершится с ошибкой:
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 прерывает выполнение:
Error: 3 conflict(s) — rerun with --forceЗдесь lockfile — единственный источник истины: он отслеживает то, что сервер записал последним, а не содержимое исходников. Если вы хотите сохранить ручные изменения в переведённых файлах, их нужно закоммитить (тогда они переживут pull) или выполнить pull с --force (тогда они будут перезаписаны).
Флаги#
--force / -f#
Перезаписывает локальные целевые файлы, которые разошлись с lockfile. Используйте после того, как проверили конфликты и решили, что версия на сервере — каноническая (например, если кто-то другой отправил push с обновлением глоссария, которому нужно отдать приоритет).
Рекомендуемый рабочий процесс:
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 run_a8c...: wrote 12 file(s), 4 already in sync.Пробный запуск:
Dry run complete. 16 file(s) already in sync.Запуск ещё не завершён:
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для текущего движка.
