Google открыла исходный код инструмента Copybara, который используют внутри компании. Это утилита для переноса и трансформации кода между репозиториями.
Часто один и тот же код приходится держать в нескольких хранилищах — например, в закрытом и публичном репозиториях. Copybara решает именно эту задачу. Нужно выбрать один репозиторий как основной, источник истины, но вносить изменения можно в любой из них. Инструмент умеет подхватывать правки из неавторитетного репозитория (скажем, от стороннего контрибьютора на GitHub) и переносить их в нужное место главного хранилища. С конфликтами слияния система разбирается как с обычным устаревшим изменением.
Ключевая архитектурная особенность — Copybara stateless, то есть не хранит своё состояние отдельно. Оно записывается прямо в метки коммита в целевом репозитории. Это позволяет запускать утилиту на разных машинах или в сервисе, и результат будет одинаковым.
Пока Copybara официально поддерживает только Git. Чтение из Mercurial — экспериментальная функция. Но архитектура плагинная, под любой источник и приёмник можно дописать свой модуль.
Для быстрого старта лучше всего взять готовые бинарники из weekly snapshot-релизов на GitHub. Если нужна свежая версия, придётся собирать из исходников: понадобятся JDK 11 и Bazel. Клонируете репозиторий, запускаете bazel build //java/com/google/copybara для сборки или bazel build //java/com/google/copybara:copybara_deploy.jar для исполняемого uberjar. Тесты запускаются через bazel test //....
Copybara можно использовать и как внешнюю зависимость в вашем Bazel-проекте через http_jar. Для запуска требуется Java Runtime 21 или новее. Есть и экспериментальная поддержка Docker — образ собирается из корня проекта, контейнер монтирует текущую директорию и принимает аргументы через переменные окружения вроде COPYBARA_SUBCOMMAND или COPYBARA_CONFIG.