NOW LET US – AI RAG SaaS Studio TP.HCM
NOW LET US
Digital Product Studio
Back to news
DEV-TOOLS...5 min read

Google copybara: moving code between repositories

Share
NOW LET US Article – Google copybara: moving code between repositories

Copybara is a tool open-sourced by Google that transforms and moves source code between different repositories, enabling seamless synchronization between public and private codebases.

A tool for transforming and moving code between repositories.

Copybara is a tool used internally at Google. It transforms and moves code between repositories.

Often, source code needs to exist in multiple repositories, and Copybara allows you to transform and move source code between these repositories. A common case is a project that involves maintaining a confidential repository and a public repository in sync.

Copybara requires you to choose one of the repositories to be the authoritative repository, so that there is always one source of truth. However, the tool allows contributions to any repository, and any repository can be used to cut a release.

The most common use case involves repetitive movement of code from one repository to another. Copybara can also be used for moving code once to a new repository.

Examples uses of Copybara include:

Importing sections of code from a confidential repository to a public repository.

Importing code from a public repository to a confidential repository.

Importing a change from a non-authoritative repository into the authoritative repository. When a change is made in the non-authoritative repository (for example, a contributor in the public repository), Copybara transforms and moves that change into the appropriate place in the authoritative repository. Any merge conflicts are dealt with in the same way as an out-of-date change within the authoritative repository.

One of the main features of Copybara is that it is stateless, or more specifically, that it stores the state in the destination repository (As a label in the commit message). This allows several users (or a service) to use Copybara for the same config/repositories and get the same result.

Currently, the only supported type of repository is Git. Copybara is also able to read from Mercurial repositories, but the feature is still experimental. The extensible architecture allows adding bespoke origins and destinations for almost any use case. Official support for other repositories types will be added in the future.

core.workflow(
name = "default",
origin = git.github_origin(
url = "https://github.com/google/copybara.git",
ref = "master",
),
destination = git.destination(
url = "file:///tmp/foo",
),
# Copy everything but don't remove a README_INTERNAL.txt file if it exists.
destination_files = glob(["third_party/copybara/**"], exclude = ["README_INTERNAL.txt"]),
authoring = authoring.pass_thru("Default email <[email protected]>"),
transformations = [
core.replace(
before = "//third_party/bazel/bashunit",
after = "//another/path:bashunit",
paths = glob(["**/BUILD"])),
core.move("", "third_party/copybara")
],
)

Run:

$ (mkdir /tmp/foo ; cd /tmp/foo ; git init --bare)
$ copybara copy.bara.sky

The easiest way to start is with weekly "snapshot" releases, that include pre-built a binary. Note that these are released automatically without any manual testing, version compatibility or correctness guarantees.

Choose a release from https://github.com/google/copybara/releases.

To use an unreleased version of copybara, so you need to compile from HEAD. In order to do that, you need to do the following:

  • Install JDK 11.

  • Install Bazel.

  • Clone the copybara source locally: git clone https://github.com/google/copybara.git

  • Build: bazel build //java/com/google/copybara

bazel build //java/com/google/copybara:copybara_deploy.jar

to create an executable uberjar.

  • Tests: bazel test //...

if you want to ensure you are not using a broken version. Note that certain tests require the underlying tool to be installed(e.g. Mercurial, Quilt, etc.). It is fine to skip those tests if your Pull Request is unrelated to those modules (And our CI will run all the tests anyway).

These packages can be installed using the appropriate package manager for your system.

If you use Intellij and the Bazel plugin, use this project configuration:

directories:
copybara/integration
java/com/google/copybara
javatests/com/google/copybara
third_party
targets:
//copybara/integration/...
//java/com/google/copybara/...
//javatests/com/google/copybara/...
//third_party/...

Note: configuration files can be stored in any place, even in a local folder. We recommend using a VCS (like git) to store them; treat them as source code.

If using a weekly snapshot release, install Copybara as follows:

  • Copybara ships with class files with version 65.0, so it must be run with Java Runtime 21 or greater. Add to your .bazelrc

file:run --java_runtime_version=remotejdk_21

  • Use http_jar

to download the release artifact.- In WORKSPACE: load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar")

  • In MODULE.bazel: http_jar = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar")

  • In WORKSPACE:

  • In WORKSPACE or MODULE.bazel, fill in the [version]

placeholder:http_jar( name = "com_github_google_copybara", # Fill in from https://github.com/google/copybara/releases/download/[version]/copybara_deploy.jar.sha256 # sha256 = "", urls = ["https://github.com/google/copybara/releases/download/[version]/copybara_deploy.jar"], )

  • In any BUILD file (perhaps /tools/BUILD.bazel

) declare thejava_binary

:load("@rules_java//java:java_binary.bzl", "java_binary") java_binary( name = "copybara", main_class = "com.google.copybara.Main", runtime_deps = ["@com_github_google_copybara//jar"], )

  • Use that target with bazel run

, for examplebazel run //tools:copybara -- migrate copy.bara.sky

There are convenience macros defined for all of Copybara's dependencies. Add the following code to your WORKSPACE

file, replacing {{ sha256sum }}

and {{ commit }}

as necessary.

http_archive(
name = "com_github_google_copybara",
sha256 = "{{ sha256sum }}",
strip_prefix = "copybara-{{ commit }}",
url = "https://github.com/google/copybara/archive/{{ commit }}.zip",
)
load("@com_github_google_copybara//:repositories.bzl", "copybara_repositories")
copybara_repositories()
load("@com_github_google_copybara//:repositories.maven.bzl", "copybara_maven_repositories")
copybara_maven_repositories()
load("@com_github_google_copybara//:repositories.go.bzl", "copybara_go_repositories")
copybara_go_repositories()

You can then build and run the Copybara tool from within your workspace:

bazel run @com_github_google_copybara//java/com/google/copybara -- <args...>

NOTE: Docker use is currently experimental, and we encourage feedback or contributions.

You can build copybara using Docker like so

docker build --rm -t copybara .

Once this has finished building, you can run the image like so from the root of the code you are trying to use Copybara on:

docker run -it -v "$(pwd)":/usr/src/app copybara help

In addition to passing cmd args to the container, you can also set the following environment variables as an alternative:

COPYBARA_SUBCOMMAND=migrate

  • allows you to change the command run, defaults to migrate

  • allows you to change the command run, defaults to COPYBARA_CONFIG=copy.bara.sky

  • allows you to specify a path to a config file, defaults to root copy.bara.sky

  • allows you to specify a path to a config file, defaults to root COPYBARA_WORKFLOW=default

  • allows you to specify the workflow to run, defaults to default

  • allows you to specify the workflow to run, defaults to COPYBARA_SOURCEREF=''

  • allows you to specify the sourceref, defaults to none

COPYBARA_OPTIONS=''

  • allows you to specify options for copybara, defaults to none
docker run \
-e COPYBARA_SUBCOMMAND='validate' \
-e COPYBARA_CONFIG='other.config.sky' \
-v "$(pwd)":/usr/src/app \
-it copybara

There are a number of ways by which to share your git config and ssh credentials with the Docker container, an example is below:

docker run \
-v ~/.gitconfig:/root/.gitconfig:ro \
-v ~/.ssh:/root/.ssh \
-v ${SSH_AUTH_SOCK}:${SSH_AUTH_SOCK} -e SSH_AUTH_SOCK
-v "$(pwd)":/usr/src/app \
-it copybara

We are still working on improving this tool.

© 2026 Now Let Us. All rights reserved.

Source: Hacker News

Advertisement
Ad slot ready: 5887729102

More in this category

NOW LET US Related – Matrix Orthogonalization Improves Memory in Recurrent Models

dev-tools

Matrix Orthogonalization Improves Memory in Recurrent Models

By orthogonalizing the mLSTM memory matrix during reads, researchers have significantly improved Noisy Associative Recall (NAR) performance, offering a viable alternative to computationally expensive Transformers in long-horizon tasks.

NOW LET US Related – The first early human eggs from stem cells

dev-tools

The first early human eggs from stem cells

Scientists have made a historic breakthrough by successfully developing the first early human eggs from stem cells using in vitro gametogenesis (IVG). This revolutionary technology could redefine human reproduction, offering new hope for infertility treatments without invasive procedures.

NOW LET US Related – ArXiv's Next Chapter

dev-tools

ArXiv's Next Chapter

On July 1, 2026, arXiv will spin out from Cornell University to become an independent nonprofit organization, aiming for greater flexibility while maintaining its core mission of free, open-access science.

NOW LET US Related – Department of Commerce has lifted export controls on Claude Fable 5 and Mythos 5

dev-tools

Department of Commerce has lifted export controls on Claude Fable 5 and Mythos 5

The US Department of Commerce has lifted export controls on Anthropic's Claude Fable 5 and Mythos 5 models. Anthropic plans to restore access starting tomorrow, marking a significant milestone for the AI startup.

NOW LET US Related – Claude Sonnet 5

dev-tools

Claude Sonnet 5

Anthropic has launched Claude Sonnet 5, its most agentic model yet, offering near-Opus 4.8 performance at a fraction of the cost.

NOW LET US Related – Claude Code is steganographically marking requests

dev-tools

Claude Code is steganographically marking requests

Claude Code has been found to silently alter system prompts using invisible Unicode characters to track API requests. This steganographic technique is used to detect unauthorized API resellers and model distillation, raising privacy and trust concerns among developers.

EXPLORE TOPICS

Discover All Categories

Deep dive into the specific technology sectors that matter most to you.