lingo pull
Получает результаты последнего push и записывает их на диск, проверяя конфликты по lockfile.
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 завершится с ошибкой:
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) или выполнить 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 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для текущего движка.