本指南介绍了如何将 Git 代码库(包括其所有信息)从 Google 的 Cloud Source Repositories (CSR) 迁移到 Secure Source Manager (SSM)。此迁移使用标准 Git 命令来克隆和推送代码库数据。
前提条件
在开始迁移之前,请确保满足以下前提条件:
- 权限:用户或服务账号必须拥有以下权限才能执行迁移:
source.repos.get,可在源 CSR 代码库的roles/source.reader角色中获取securesourcemanager.instances.access(在roles/securesourcemanager.instanceAccessor角色中提供)和securesourcemanager.repositories.fetch(在roles/securesourcemanager.repoWriter角色中提供)。如果您要创建新代码库,请参阅创建代码库。
- Git 客户端:您需要一台安装了 Git 命令行工具的计算机。
- Google Cloud SDK:如需在使用 HTTPS 时进行身份验证,您必须在安装 Git 工具的同一台计算机上安装 395.0.0 版或更高版本。如果您没有 Google Cloud SDK,则必须使用 SSH 密钥连接到 CSR 和 SSM。
- SSM 实例:确保您可以从计算机访问 SSM 实例。如果您的实例是使用 Private Service Connect 配置的,请参阅访问专用实例,了解访问详情。
- 本地存储空间:您需要有足够的本地磁盘可用空间来临时存储要迁移的仓库的克隆。
迁移步骤
迁移过程包括将整个代码库从 CSR 克隆到本地计算机,然后将克隆推送到 SSM 代码库。
确定 CSR、SSM 代码库的访问正文和方法
当您以用户正文身份进行身份验证时,可以使用 HTTP 或 SSH 传输方式连接到 CSR;当您以服务账号身份进行身份验证时,可以使用 HTTP 传输方式连接到 CSR。您可以使用 HTTP 或 SSH 传输方式,以用户或服务账号正文的身份通过 SSM 进行连接和身份验证。
您无需在 CSR 和 SSM 中使用相同的传输或正文。确定您将为每个平台使用的正文和传输。如需详细了解如何模拟服务账号,请参阅服务账号模拟。
确保 CSR 代码库为只读
本迁移指南不使用自动镜像或同步。
因此,请确保在迁移期间或之后没有人写入 CSR 代码库。更新 IAM 权限,使任何用户在代码库中都只拥有 roles/source.reader 角色。或者,与用户协调,在迁移期间停止所有提交。
创建 Secure Source Manager 代码库
如果管理员已为您创建代码库,您可以跳过此步骤。
如需在 SSM 实例中创建空代码库,请按照创建新代码库指南操作。 请确保:
- 如果使用界面,请勿选择初始化代码库,因为这会创建一个非空代码库。
- 如果使用 Google Cloud CLI,请勿设置
--gitignores、--readme和--licenses标志,因为这会创建一个非空代码库。 - 如果使用 API,请勿设置
InitialConfig的gitignores、license和readme字段,因为这会创建非空代码库。
验证 SSM 代码库设置
通过检查界面或克隆代码库并运行 git show-ref 来验证代码库是否为空。如果代码库为空,则输出为空。
通过检查界面或使用 API 确保没有有效的分支保护规则。不应有任何规则,或者应停用所有规则,以防止阻止迁移。
确保本地和远程磁盘空间
在克隆 CSR 代码库之前,请先确定其总大小。运行 gcloud source repos describe <var>CSR_REPO_NAME</var>。此命令显示了代码库中的总字节数。如需评估 Linux 系统上的可用磁盘空间,请运行 df . 以查看当前目录中的可用字节数。
SSM 的默认限制为每个实例 100 GB 的存储空间。在克隆 CSR 代码库之前,请验证该代码库是否适合。
克隆 CSR 代码库
将完整的代码库历史记录从 CSR 克隆到本地计算机。
- 前往您要临时存储代码库的本地目录。
- 克隆代码库:
sh git clone <var>CSR_REPO_URL</var> --mirror
此命令会创建一个裸克隆,该克隆经过优化,可将整个代码库内容推送到另一个远程代码库。您会发现,该目录仅包含 config 和 HEAD 等文件,而不是您的代码库内容。这是预期行为;所有代码库内容都已克隆并位于 objects 目录和其他目录中,但没有工作副本。
将 Secure Source Manager 代码库添加为新的远程代码库
运行以下命令:
git remote add ssm <var>SSM_REPOSITORY_URL</var>
将完整代码库推送到 Secure Source Manager
将本地克隆中的所有分支、标记和引用推送到 SSM 远程代码库:
git push --mirror ssm
验证
推送操作完成后,将 SSM 仓库克隆到其他目录。然后,比较代码库的 CSR 和 SSM 副本:
- 分支数量:在每个代码库中运行
git branch -r,并验证分支数量是否相同。在 Linux 或 macOS 系统上,将命令通过管道传输到wc -l会统计输出的行数。 - 标记数量:在每个代码库中运行
git tag,并验证标记数量是否相同。在 Linux 或 macOS 系统上,将命令通过管道传输到wc -l可统计输出的行数。 - HEAD 提交:在每个代码库中运行
git rev-parse HEAD,并验证提交哈希是否相等。 - 提交次数:在每个代码库中运行
git rev-list --all --count,并验证提交次数是否相同。
清理
- 如果您在迁移期间模拟了某个服务账号,请运行
gcloud config set account以重置您的凭据。 - 如果您停用了分支保护规则,请在 SSM 代码库中重新启用分支保护规则。
- 从用于迁移的计算机中移除 CSR 代码库的裸副本。
- 删除原始 CSR 代码库。