google/copybara
GitHub: google/copybara
Copybara 是 Google 开源的代码库间转换与移动工具,支持在多个仓库间同步和迁移代码并保持单一事实来源。
Stars: 3737 | Forks: 335
# Copybara
*一个用于在代码库之间转换和移动代码的工具。*
Copybara 是一个在 Google 内部使用的工具。它可以在不同的代码库之间转换和移动代码。
通常,源代码需要存在于多个代码库中,而 Copybara 允许您在这些代码库之间转换
和移动源代码。一个常见的情况是,一个项目需要
维护一个保密代码库和一个公开代码库的同步。
Copybara 要求您选择其中一个代码库作为权威代码库,这样
就始终会有一个单一事实来源。然而,该工具允许向任何代码库提交贡献,并且
任何代码库都可以用于发布版本。
最常见的使用场景涉及将代码从一个代码库重复移动到另一个代码库。
Copybara 也可用于将代码一次性移动到一个新代码库。
Copybara 的使用示例包括:
- 将部分代码从保密代码库导入到公开代码库。
- 将代码从公开代码库导入到保密代码库。
- 将变更从非权威代码库导入到权威代码库。当
在非权威代码库中进行变更时(例如,公开
代码库中的贡献者),Copybara 会将该变更转换并移动到
权威代码库中的适当位置。任何合并冲突的处理方式,都与处理权威代码库中过时的
变更的方式相同。
Copybara 的主要特性之一是它是无状态的,或者更具体地说,它将
状态存储在目标代码库中(作为提交信息中的一个标签)。这使得多个
用户(或服务)可以使用 Copybara 处理相同的配置/代码库,并获得相同的结果。
目前,唯一支持的代码库类型是 Git。Copybara 也可以
从 Mercurial 代码库中读取,但该功能仍处于实验阶段。
其可扩展的架构允许为
几乎任何使用场景添加定制的源端和目标端。
未来将添加对其他代码库类型的官方支持。
## 示例
```
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 "),
transformations = [
core.replace(
before = "//third_party/bazel/bashunit",
after = "//another/path:bashunit",
paths = glob(["**/BUILD"])),
core.move("", "third_party/copybara")
],
)
```
运行:
```
$ (mkdir /tmp/foo ; cd /tmp/foo ; git init --bare)
$ copybara copy.bara.sky
```
## 开始使用 Copybara
最简单的入门方式是使用每周的“快照”发布版本,其中包含预构建的二进制文件。
请注意,这些版本是自动发布的,没有任何手动测试、版本兼容性或正确性保证。
请从 https://github.com/google/copybara/releases 中选择一个发布版本。
### 从源码构建
如果要使用未发布的 Copybara 版本,您需要从 HEAD 进行编译。
为此,您需要执行以下操作:
* [安装 JDK 11](https://www.oracle.com/java/technologies/downloads/#java11)。
* [安装 Bazel](https://bazel.build/install)。
* 在本地克隆 copybara 源码:
* `git clone https://github.com/google/copybara.git`
* 构建:
* `bazel build //java/com/google/copybara`
* `bazel build //java/com/google/copybara:copybara_deploy.jar` 以创建一个可执行的超大 jar 包 (uberjar)。
* 测试:如果您想确保没有使用损坏的版本,请运行 `bazel test //...`。请注意,
某些测试需要安装底层工具(例如 Mercurial、Quilt 等)。如果
您的 Pull Request 与这些模块无关,可以跳过这些测试(而且我们的 CI 无论如何都会
运行所有测试)。
### 系统软件包
这些软件包可以使用适用于您系统的相应软件包管理器进行
安装。
#### Arch Linux
* [`aur/copybara-git`][install/archlinux/aur-git]
### 结合使用 Intellij 和 Bazel 插件
如果您使用 Intellij 和 Bazel 插件,请使用此项目配置:
```
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/...
```
注意:配置文件可以存放在任何地方,甚至是在本地文件夹中。
我们建议使用 VCS(如 git)来存储它们;将它们视为源代码。
### 在 Bazel 中使用预构建的 Copybara
如果使用每周快照发布版本,请按如下方式安装 Copybara:
1. Copybara 附带了版本为 65.0 的类文件,因此必须使用 Java Runtime 21 或更高版本运行。在您的 `.bazelrc` 文件中添加:`run --java_runtime_version=remotejdk_21`
2. 使用 `http_jar` 下载发布工件。
- 在 WORKSPACE 中:`load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar")`
- 在 MODULE.bazel 中:`http_jar = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar")`
3. 在 WORKSPACE 或 MODULE.bazel 中,填写 `[version]` 占位符:
http_jar(
name = "com_github_google_copybara",
# 从 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"],
)
4. 在任何 BUILD 文件(可能是 `/tools/BUILD.bazel`)中声明 `java_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"],
)
5. 使用 `bazel run` 运行该目标,例如 `bazel run //tools:copybara -- migrate copy.bara.sky`
### 将 Copybara 源码作为外部 Bazel 代码库进行构建
为 Copybara 的所有依赖项定义了便捷宏。将
以下代码添加到您的 `WORKSPACE` 文件中,并根据需要替换 `{{ sha256sum }}` 和
`{{ commit }}`。
```
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()
```
然后,您可以在您的工作区内构建并运行 Copybara 工具:
```
bazel run @com_github_google_copybara//java/com/google/copybara --
```
### 使用 Docker 构建和运行 Copybara
*注意:Docker 的使用目前处于实验阶段,我们鼓励提供反馈或贡献。*
您可以像这样使用 Docker 构建 copybara
```
docker build --rm -t copybara .
```
构建完成后,您可以从您尝试使用 Copybara 处理的代码的
根目录像这样运行该镜像:
```
docker run -it -v "$(pwd)":/usr/src/app copybara help
```
#### 环境变量
除了向容器传递 cmd 参数外,您还可以设置以下
环境变量作为替代方案:
* `COPYBARA_SUBCOMMAND=migrate`
* 允许您更改运行的命令,默认为 `migrate`
* `COPYBARA_CONFIG=copy.bara.sky`
* 允许您指定配置文件的路径,默认为根目录下的 `copy.bara.sky`
* `COPYBARA_WORKFLOW=default`
* 允许您指定要运行的工作流,默认为 `default`
* `COPYBARA_SOURCEREF=''`
* 允许您指定 sourceref,默认为无
* `COPYBARA_OPTIONS=''`
* 允许您为 copybara 指定选项,默认为无
```
docker run \
-e COPYBARA_SUBCOMMAND='validate' \
-e COPYBARA_CONFIG='other.config.sky' \
-v "$(pwd)":/usr/src/app \
-it copybara
```
#### Git 配置和凭证
有多种方法可以与
Docker 容器共享您的 git 配置和 ssh 凭证,以下是一个示例:
```
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
```
## 文档
我们仍在完善文档。以下是一些资源:
* [参考文档](docs/reference.md)
* [示例](docs/examples.md)
* [入门教程](https://blog.kubesimplify.com/moving-code-between-git-repositories-with-copybara)
## 联系我们
如果您对 Copybara 的工作原理有任何疑问,请通过我们的
[邮件列表](https://groups.google.com/forum/#!forum/copybara-discuss) 联系我们。
## 可选提示
* 如果您想查看 Bazel 中的测试错误,而不必 `cat`
日志,请将此行添加到您的 `~/.bazelrc` 中:
test --test_output=streamed
标签:Git, JS文件枚举, SOC Prime, 代码同步, 域名枚举, 安全可观测性, 开发工具, 版本控制, 网络安全研究, 网络调试, 自动化, 请求拦截