关于使用 GitHub Enterprise Importer 进行存储库迁移
您可以使用 GitHub CLI 或 API 运行迁移。
GitHub CLI 简化了迁移过程,建议大多数客户使用。具有大量自定义需求的高级客户可以使用 API 来构建他们自己的与 GitHub Enterprise Importer 集成。
先决条件
- 我们强烈建议您先进行试运行,然后尽快完成生产迁移。要了解有关试运行的更多信息,请参阅“从 Azure DevOps 到 GitHub Enterprise Cloud 的迁移概述”。
- 确保您了解将要迁移的数据以及 Importer 的已知支持限制。有关更多信息,请参阅“关于从 Azure DevOps 到 GitHub Enterprise Cloud 的迁移”。
- 虽然不是必需的,但我们建议在生产迁移期间停止工作。Importer 不支持增量迁移,因此迁移期间发生的任何更改都不会迁移。如果您选择在生产迁移期间不停止工作,则需要手动迁移这些更改。
- 对于 GitHub 上的目标组织,您需要是组织所有者或具有迁移者角色。有关迁移者角色的更多信息,请参阅“管理 Azure DevOps 迁移的访问权限”。
步骤 0:准备使用 GitHub GraphQL API
要执行 GraphQL 查询,您需要编写自己的脚本或使用 HTTP 客户端,例如 Insomnia。
要了解有关 GitHub GraphQL API 入门的更多信息,包括如何进行身份验证,请参阅“使用 GraphQL 形成调用”。
您将向迁移的**目标**发送所有 GraphQL 查询。如果您要迁移到具有数据驻留区的 GitHub Enterprise Cloud,请确保将查询发送到 GHE.com 上您企业子域的端点。
步骤 1:获取迁移目标的 ownerId
作为 GitHub Enterprise Cloud 中的组织所有者,请使用 GetOrgInfo
查询返回 ownerId
(也称为组织 ID),该 ID 用于标识您希望拥有迁移存储库的组织。您需要 ownerId
来识别您的迁移目标。
GetOrgInfo
查询
query(
$login: String!
){
organization (login: $login)
{
login
id
name
databaseId
}
}
查询变量 | 描述 |
---|---|
login | 您的组织名称。 |
GetOrgInfo
响应
{
"data": {
"organization": {
"login": "Octo",
"id": "MDEyOk9yZ2FuaXphdGlvbjU2MTA=",
"name": "Octo-org",
"databaseId": 5610
}
}
}
在此示例中,MDEyOk9yZ2FuaXphdGlvbjU2MTA=
是组织 ID 或 ownerId
,我们将在下一步中使用它。
步骤 2:确定迁移来源
您可以使用 createMigrationSource
查询设置迁移源。您需要提供从 GetOrgInfo
查询中收集的 ownerId
或组织 ID。
您的迁移源是您的 ADO 组织。
createMigrationSource
变异
mutation createMigrationSource($name: String!, $ownerId: ID!) {
createMigrationSource(input: {name: $name, url: "https://dev.azure.com", ownerId: $ownerId, type: AZURE_DEVOPS}) {
migrationSource {
id
name
url
type
}
}
}
注意
请确保对 type
使用 AZURE_DEVOPS
。
查询变量 | 描述 |
---|---|
name | 迁移源的名称。此名称仅供您参考,因此您可以使用任何字符串。 |
ownerId | 您在 GitHub Enterprise Cloud 上的组织的组织 ID。 |
createMigrationSource
响应
{
"data": {
"createMigrationSource": {
"migrationSource": {
"id": "MS_kgDaACQxYmYxOWU4Yi0wNzZmLTQ3NTMtOTdkZC1hNGUzZmYxN2U2YzA",
"name": "Azure Devops Source",
"url": "https://dev.azure.com",
"type": "AZURE_DEVOPS"
}
}
}
}
在此示例中,MS_kgDaACQxYmYxOWU4Yi0wNzZmLTQ3NTMtOTdkZC1hNGUzZmYxN2U2YzA
是迁移源 ID,我们将在下一步中使用它。
步骤 3:开始您的存储库迁移
开始迁移时,单个存储库及其伴随数据将迁移到您标识的全新 GitHub 存储库中。
如果您想一次从同一源组织迁移多个存储库,则可以排队多个迁移。您可以同时运行最多 5 个存储库迁移。
startRepositoryMigration
变异
mutation startRepositoryMigration (
$sourceId: ID!,
$ownerId: ID!,
$sourceRepositoryUrl: URI!,
$repositoryName: String!,
$continueOnError: Boolean!,
$accessToken: String!,
$githubPat: String!,
$targetRepoVisibility: String!
){
startRepositoryMigration( input: {
sourceId: $sourceId,
ownerId: $ownerId,
repositoryName: $repositoryName,
continueOnError: $continueOnError,
accessToken: $accessToken,
githubPat: $githubPat,
targetRepoVisibility: $targetRepoVisibility
sourceRepositoryUrl: $sourceRepositoryUrl,
}) {
repositoryMigration {
id
migrationSource {
id
name
type
}
sourceUrl
}
}
}
查询变量 | 描述 |
---|---|
sourceId | createMigrationSource 变异返回的迁移源 id 。 |
ownerId | 您在 GitHub Enterprise Cloud 上的组织的组织 ID。 |
repositoryName | 自定义唯一的存储库名称,当前未被 GitHub Enterprise Cloud 上您组织拥有的任何存储库使用。迁移完成后或停止后,将在此存储库中创建错误日志问题。 |
continueOnError | 迁移设置,允许在遇到不会导致迁移失败的错误时继续迁移。必须为 true 或 false 。我们强烈建议将 continueOnError 设置为 true ,以便您的迁移将继续进行,除非导入程序无法移动 Git 源或导入程序已断开连接且无法重新连接以完成迁移。 |
githubPat | GitHub Enterprise Cloud 上目标组织的个人访问令牌。 |
accessToken | 源的个人访问令牌。 |
targetRepoVisibility | 新存储库的可见性。必须为 private 、public 或 internal 。如果未设置,则您的存储库将作为私有存储库迁移。 |
sourceRepositoryUrl | 源存储库的 URL,使用格式 https://dev.azure.com/{organization}/{project}/_git/{repository} 。 |
有关个人访问令牌要求,请参阅“管理来自 Azure DevOps 的迁移的访问权限”。
在下一步中,您将使用 startRepositoryMigration
变异返回的迁移 ID 检查迁移状态。
步骤 4:检查迁移状态
为了检测任何迁移失败并确保您的迁移正常工作,您可以使用 getMigration
查询检查迁移状态。您还可以使用 getMigrations
检查多个迁移的状态。
getMigration
查询将返回一个状态,让您知道迁移是 queued
、in progress
、failed
还是 completed
。如果您的迁移失败,导入程序将提供失败的原因。
getMigration
查询
query (
$id: ID!
){
node( id: $id ) {
... on Migration {
id
sourceUrl
migrationSource {
name
}
state
failureReason
}
}
}
查询变量 | 描述 |
---|---|
id | startRepositoryMigration 变异 返回的迁移 id 。 |
步骤 5:验证迁移并检查错误日志
要完成迁移,我们建议您检查“迁移日志”问题。此问题是在 GitHub 上的目标存储库中创建的。
最后,我们建议您检查迁移的存储库,以确保其完整性。
步骤 1:安装 GitHub CLI 的 ADO2GH 扩展
如果这是您的第一次迁移,则需要安装 GitHub CLI 的 ADO2GH 扩展。有关 GitHub CLI 的更多信息,请参阅“关于 GitHub CLI”。
或者,您可以从 发布页面 下载 github/gh-ado2gh
存储库的独立二进制文件。您可以直接运行此二进制文件,无需 gh
前缀。
-
安装 GitHub CLI。有关 GitHub CLI 的安装说明,请参阅 GitHub CLI 存储库。
注意
您需要 GitHub CLI 2.4.0 或更高版本。您可以使用
gh --version
命令检查您安装的版本。 -
安装 ADO2GH 扩展。
Shell gh extension install github/gh-ado2gh
gh extension install github/gh-ado2gh
任何时候,如果您需要 ADO2GH 扩展的帮助,都可以对命令使用 --help
标志。例如,gh ado2gh --help
将列出所有可用的命令,而 gh ado2gh migrate-repo --help
将列出 migrate-repo
命令可用的所有选项。
步骤 2:更新 GitHub CLI 的 ADO2GH 扩展
GitHub CLI 的 ADO2GH 扩展每周更新一次。为确保您使用的是最新版本,请更新扩展。
gh extension upgrade github/gh-ado2gh
gh extension upgrade github/gh-ado2gh
步骤 3:设置环境变量
在您可以使用 ADO2GH 扩展迁移到 GitHub Enterprise Cloud 之前,您必须创建可以访问源组织和目标组织的个人访问令牌,然后将个人访问令牌设置为环境变量。
-
创建并记录一个个人访问令牌(经典),该令牌将对 GitHub Enterprise Cloud 上的目标组织进行身份验证,并确保令牌满足所有要求。有关更多信息,请参阅“管理来自 Azure DevOps 的迁移的访问权限”。
-
创建并记录一个个人访问令牌,该令牌将对 Azure DevOps 上的源组织进行身份验证,并确保此令牌满足所有要求。有关更多信息,请参阅“管理来自 Azure DevOps 的迁移的访问权限”。
-
为个人访问令牌设置环境变量,在以下命令中将 TOKEN 替换为您上面记录的个人访问令牌。对目标组织使用
GH_PAT
,对源组织使用ADO_PAT
。-
如果您使用的是 Terminal,请使用
export
命令。Shell export GH_PAT="TOKEN" export ADO_PAT="TOKEN"
export GH_PAT="TOKEN" export ADO_PAT="TOKEN"
-
如果您使用的是 PowerShell,请使用
$env
命令。Shell $env:GH_PAT="TOKEN" $env:ADO_PAT="TOKEN"
$env:GH_PAT="TOKEN" $env:ADO_PAT="TOKEN"
-
-
如果您要迁移到具有数据驻留区的 GitHub Enterprise Cloud,为了方便起见,请为您的企业的**基本 API URL** 设置环境变量。例如
Shell export TARGET_API_URL="https://api.octocorp.ghe.com"
export TARGET_API_URL="https://api.octocorp.ghe.com"
您将在使用 GitHub CLI 运行的命令中使用
--target-api-url
选项使用此变量。
步骤 4:生成迁移脚本
如果您想一次将多个存储库迁移到 GitHub Enterprise Cloud,请使用 GitHub CLI 生成迁移脚本。生成的脚本将包含迁移命令列表,每个存储库一个。
如果您想迁移单个存储库,请跳到下一步。
生成迁移脚本
要生成迁移脚本,请运行 gh ado2gh generate-script
命令。
gh ado2gh generate-script --ado-org SOURCE --github-org DESTINATION --output FILENAME
gh ado2gh generate-script --ado-org SOURCE --github-org DESTINATION --output FILENAME
占位符
将上述命令中的占位符替换为以下值。
占位符 | 值 |
---|---|
SOURCE | 源组织的名称 |
DESTINATION | 目标组织的名称 |
FILENAME | 生成的迁移脚本的文件名 如果您使用的是 Terminal,请使用 .ps1 文件扩展名,因为生成的脚本需要 PowerShell 才能运行。您可以为 Mac 或 Linux 安装 PowerShell。 |
其他参数
参数 | 描述 |
---|---|
--target-api-url TARGET-API-URL | 如果您要迁移到 GHE.com,请添加 --target-api-url TARGET-API-URL ,其中 TARGET-API-URL 是您企业子域的基本 API URL。例如:https://api.octocorp.ghe.com 。 |
--all | 向脚本添加其他功能,例如重新连接管道、创建团队和配置 Azure Boards 集成。 |
--download-migration-logs | 下载每个迁移存储库的迁移日志。有关迁移日志的更多信息,请参阅“访问 GitHub Enterprise Importer 的迁移日志”。 |
查看迁移脚本
生成脚本后,请查看文件并选择性地编辑脚本。
- 如果您不想迁移任何存储库,请删除或注释掉相应的行。
- 如果您希望任何存储库在目标组织中具有不同的名称,请更新相应
--target-repo
标志的值。 - 如果您想更改新存储库的可见性,请更新相应
--target-repo-visibility
标志的值。默认情况下,脚本会设置与源存储库相同的可见性。
如果您将 ADO2GH 作为独立二进制文件而不是作为 GitHub CLI 的扩展下载,则需要更新生成的脚本以运行二进制文件而不是 gh ado2gh
。
步骤 5:迁移存储库
您可以使用迁移脚本迁移多个存储库,或者使用 gh ado2gh migrate-repo
命令迁移单个存储库。
迁移多个存储库
要迁移多个存储库,请运行上面生成的脚本。将以下命令中的 FILENAME 替换为您生成脚本时提供的文件名。
-
如果您使用的是终端,请使用
./
。Shell ./FILENAME
./FILENAME
-
如果您使用的是 PowerShell,请使用
.\
。Shell .\FILENAME
.\FILENAME
迁移单个存储库
要迁移单个存储库,请使用 gh ado2gh migrate-repo
命令。
gh ado2gh migrate-repo --ado-org SOURCE --ado-team-project TEAM-PROJECT --ado-repo CURRENT-NAME --github-org DESTINATION --github-repo NEW-NAME
gh ado2gh migrate-repo --ado-org SOURCE --ado-team-project TEAM-PROJECT --ado-repo CURRENT-NAME --github-org DESTINATION --github-repo NEW-NAME
注意
如果您要迁移到 GHE.com,请添加 --target-api-url TARGET-API-URL
,其中 TARGET-API-URL 是您企业子域的基本 API URL。例如:https://api.octocorp.ghe.com
。
将上述命令中的占位符替换为以下值。
占位符 | 值 |
---|---|
SOURCE | 源组织的名称 |
CURRENT-NAME | 您要迁移的存储库的名称 |
DESTINATION | 目标组织的名称 |
NEW-NAME | 您希望迁移后的存储库具有的名称 |
TEAM-PROJECT | 您要迁移的存储库所属团队项目的名称 |
如果要取消迁移,请使用 abort-migration
命令,并将 MIGRATION-ID 替换为 migrate-repo
返回的 ID。
gh ado2gh abort-migration --migration-id MIGRATION-ID
gh ado2gh abort-migration --migration-id MIGRATION-ID
步骤 6:验证迁移并检查错误日志
迁移完成后,我们建议您查看迁移日志。有关更多信息,请参阅“访问 GitHub Enterprise Importer 的迁移日志”。
我们建议您检查迁移后的存储库,确保其完整性。