跳至主要内容

将仓库从 GitHub Enterprise Server 迁移到 GitHub Enterprise Cloud

您可以使用 GitHub CLI 或 API 将仓库从 GitHub Enterprise Server 迁移到 GitHub Enterprise Cloud。

工具导航

关于使用 GitHub Enterprise Importer 进行仓库迁移

您可以通过 GitHub CLI 或 API 来运行迁移。

GitHub CLI 简化了迁移流程,推荐给大多数客户。对自定义需求较高的高级客户可以使用 API,构建自己的 GitHub Enterprise Importer 集成。

If you choose to use the API, you'll need to write your own scripts or use an HTTP client like Insomnia. You can learn more about getting started with GitHub's APIs in Getting started with the REST API and Forming calls with GraphQL.

要使用 API 将你的仓库从 GitHub Enterprise Server 迁移到 GitHub Enterprise Cloud,你需要

  1. 为源组织和目标组织创建个人访问令牌
  2. 获取 GitHub Enterprise Cloud 上目标组织的 ownerId
  3. 通过 GitHub 的 GraphQL API 设置迁移源,以标识迁移的来源
  4. 对每个想要迁移的仓库,重复以下步骤。
    • 在你的 GitHub Enterprise Server 实例上使用 REST API 为仓库生成迁移归档
    • 将迁移归档上传到 GitHub 能访问的位置
    • 使用目标方的 GraphQL API 启动迁移,并传入归档的 URL
    • 通过 GraphQL API 检查迁移状态
    • 验证迁移并检查错误日志

要查看使用 API 的说明,请使用页面顶部的工具切换器。

要查看使用 GitHub CLI 的说明,请使用页面顶部的工具切换器。

先决条件

  • 我们强烈建议您先进行迁移试运行,并在试运行后尽快完成正式迁移。要了解有关试运行的更多信息,请参阅 GitHub 产品之间迁移概述
  • 确保您了解将要迁移的数据以及 Importer 已知的支持限制。更多信息,请参阅 关于 GitHub 产品之间的迁移
  • 虽然不是强制要求,但我们建议在正式迁移期间暂停工作。Importer 不支持增量迁移,因此迁移期间所做的任何更改都不会被迁移。如果您选择在正式迁移期间不暂停工作,则需要手动迁移这些更改。
  • 在源组织和目标组织中,你必须是组织所有者或被授予迁移者(migrator)角色。更多信息,请参阅 Managing access for a migration between GitHub products
  • 如果使用 GitHub Enterprise Server 3.8 或更高版本,要为导出归档配置 Blob 存储,需要访问管理控制台(Management Console)。

步骤 1. 创建个人访问令牌

  1. 创建并记录一个(经典)个人访问令牌,用于对 GitHub Enterprise Cloud 上的目标组织进行身份验证,确保该令牌满足所有要求。有关详细信息,请参阅 管理 GitHub 产品之间迁移的访问权限
  2. 创建并记录一个个人访问令牌,用于对源组织进行身份验证,同样确保该令牌满足所有相同要求。

步骤 2:获取目标组织的 ownerId

作为 GitHub Enterprise Cloud 中的组织所有者,请使用 GetOrgInfo 查询返回 ownerId(也称为组织 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,我们将在下一步中使用它。

步骤 3:设置 Blob 存储

在执行仓库迁移时,必须将仓库数据存储在 GitHub Enterprise Importer 可以访问的位置。这可以通过以下方式实现:

  • 使用 GHES 实例上的本地存储(GHES 3.16 及以上)
  • 使用 Blob 存储提供商

使用本地存储(GHES 3.16+)

使用本地存储运行迁移时,归档数据会写入 GitHub Enterprise Server 实例的磁盘,无需云存储提供商。

  • 如果没有防火墙规则阻止 GitHub Enterprise Server 的出站流量,GitHub Enterprise Importer 可以自动从 GitHub Enterprise Server 检索已存储的归档。
  • 如果已设置防火墙规则且不希望允许 GitHub Enterprise Importer 访问,你可以将归档数据上传到 GitHub 拥有的 Blob 存储,以供 GitHub Enterprise Importer 访问。要手动执行此操作,请参阅本文 API 版本中的 Uploading your migration archives to GitHub-owned blob storage
  1. 在 GitHub Enterprise Server 的管理账户上,任意页面的右上角,点击.
  2. 在 "Site admin\" 侧边栏,点击 Management Console
  3. 登录管理控制台。
  4. 在左侧边栏,点击 Migrations
  5. 点击 Enable GitHub Migrations
  6. 在 “Migrations Storage” 下,点击 Local Storage
  7. 点击 Save settings

执行迁移时,请监控 GitHub Enterprise Server 的磁盘空间。迁移归档会在 7 天后自动删除。若要释放空间,你可以使用 REST API 端点(组织迁移) 删除归档。

使用 Blob 存储提供商

如果你的 GitHub Enterprise Server 实例位于防火墙后,可能需要使用外部云服务来设置 Blob 存储。

首先,需要使用受支持的提供商设置 Blob 存储。随后,如果使用云提供商,则必须在管理控制台或 GitHub CLI 中配置该存储提供商的凭据。

GitHub CLI 支持以下 Blob 存储提供商

  • Amazon Web Services(AWS)S3
  • Azure Blob Storage

注意

仅当使用 GitHub Enterprise Server 3.8 及以上版本时才需配置 Blob 存储。如果使用 3.7 或更低版本,请跳至 步骤 4:在 GitHub Enterprise Cloud 中设置迁移源

迁移包含大 Git 源或元数据的仓库时需要 Blob 存储。如果使用 GitHub Enterprise Server 3.7 或更低版本,无法执行 Git 源或元数据导出超过 2GB 的迁移。要进行此类迁移,请升级到 GitHub Enterprise Server 3.8 或以上版本。

设置 AWS S3 存储桶

在 AWS 中,创建一个 S3 存储桶。更多信息,请参阅 AWS 文档中的《创建存储桶》。

您还需要具有以下权限的 AWS 访问密钥和秘密密钥

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::github-migration-bucket",
                "arn:aws:s3:::github-migration-bucket/*"
            ]
        }
    ]
}

注意

GitHub Enterprise Importer 在迁移完成后不会删除您在 AWS 上的归档。为降低存储成本,我们建议配置归档的自动删除。更多信息,请参阅 AWS 文档中的《在存储桶上设置生命周期配置》。

设置 Azure Blob Storage 账户

在 Azure 中,创建一个存储账户并记录下连接字符串。更多信息,请参阅 Microsoft 文档中的《管理存储账户访问密钥》。

注意

GitHub Enterprise Importer 在迁移完成后不会删除您在 Azure Blob Storage 上的归档。为降低存储成本,我们建议配置归档的自动删除。更多信息,请参阅 Microsoft 文档中的《通过自动管理数据生命周期来优化成本》。

在 GitHub Enterprise Server 实例的管理控制台中配置 Blob 存储

在设置好 AWS S3 存储桶或 Azure Blob Storage 账户后,需要在 GitHub Enterprise Server 实例的管理控制台中配置 Blob 存储。有关管理控制台的更多信息,请参阅 Administering your instance from the Management Console

  1. 在 GitHub Enterprise Server 的管理账户上,任意页面的右上角,点击.

  2. 如果尚未在 “Site admin” 页面,左上角点击 Site admin

  3. 在 "Site admin\" 侧边栏,点击 Management Console

  4. 登录管理控制台。

  5. 在顶部导航栏,点击 Settings

  6. Migrations 下,点击 Enable GitHub Migrations

  7. 可选地,若要导入为 GitHub Actions 配置的存储设置,选择 Copy Storage settings from Actions。更多信息请参阅 Enabling GitHub Actions with Azure Blob storageEnabling GitHub Actions with Amazon S3 storage

    注意

    复制存储设置后,仍可能需要更新云存储账户的配置,以便与 GitHub Enterprise Importer 配合使用。尤其要确保已将 GitHub 的 IP 地址列入白名单。更多信息请参阅 Managing access for a migration between GitHub products

  8. 如果未从 GitHub Actions 导入存储设置,请选择 Azure Blob Storage 或 Amazon S3 并填写必填信息。

    注意

    如果使用 Amazon S3,则必须将 “AWS Service URL” 设置为存放桶所在 AWS 区域的标准终端。例如,若桶位于 eu-west-1 区域,则 “AWS Service URL” 为 https://s3.eu-west-1.amazonaws.com。你的 GitHub Enterprise Server 实例网络必须能够访问此主机。网关终端(gateway endpoints)不受支持,例如 bucket.vpce-0e25b8cdd720f900e-argc85vg.s3.eu-west-1.vpce.amazonaws.com。有关网关终端的更多信息,请参阅 AWS 文档中的 Gateway endpoints for Amazon S3

  9. 点击 Test storage settings

  10. 点击 Save settings

允许网络访问

如果在存储账户上配置了防火墙规则,请确保已允许迁移目标的 IP 段访问。参见 Managing access for a migration between GitHub products

步骤 4:在 GitHub Enterprise Cloud 中设置迁移源

您可以使用 createMigrationSource 查询设置迁移来源。您需要提供从 GetOrgInfo 查询获得的 ownerId(组织 ID)。

你的迁移源是 GitHub Enterprise Server 上的组织。

createMigrationSource 变更

mutation createMigrationSource($name: String!, $url: String!, $ownerId: ID!) {
  createMigrationSource(input: {name: $name, url: $url, ownerId: $ownerId, type: GITHUB_ARCHIVE}) {
    migrationSource {
      id
      name
      url
      type
    }
  }
}

注意

确保对 type 使用 GITHUB_ARCHIVE

查询变量描述
name迁移来源的名称。此名称仅供您参考,您可以使用任意字符串。
ownerId您在 GitHub Enterprise Cloud 上的组织 ID。
url你的 GitHub Enterprise Server 实例的 URL。此 URL 不需从 GitHub Enterprise Cloud 可访问。

createMigrationSource 响应

{
  "data": {
    "createMigrationSource": {
      "migrationSource": {
        "id": "MS_kgDaACRjZTY5NGQ1OC1mNDkyLTQ2NjgtOGE1NS00MGUxYTdlZmQwNWQ",
        "name": "GHES Source",
        "url": "https://my-ghes-hostname.com",
        "type": "GITHUB_ARCHIVE"
      }
    }
  }
}

在此示例中,MS_kgDaACRjZTY5NGQ1OC1mNDkyLTQ2NjgtOGE1NS00MGUxYTdlZmQwNWQ 是迁移源 ID,稍后步骤将使用它。

步骤 5:在你的 GitHub Enterprise Server 实例上生成迁移归档

你将使用 REST API 在 GitHub Enterprise Server 启动两项“迁移”:一项生成仓库 Git 源的归档,另一项生成仓库元数据(如 Issue 和 Pull Request)的归档。

要生成 Git 源归档,请向 https://HOSTNAME/api/v3/orgs/ORGANIZATION/migrations 发起 POST 请求,将 HOSTNAME 替换为你的 GitHub Enterprise Server 实例的主机名,将 ORGANIZATION 替换为组织的登录名。

在请求体中,指定要迁移的单个仓库。你的请求大致如下所示

POST /api/v3/orgs/acme-corp/migrations HTTP/1.1
Accept: application/vnd.github+json
Authorization: Bearer <TOKEN>
Content-Type: application/json
Host: github.acmecorp.net

{
  "repositories": ["repository_to_migrate"],
  "exclude_metadata": true
}

要生成元数据归档,向相同 URL 发送类似请求,使用以下请求体

{
  "repositories": ["repository_to_migrate"],
  "exclude_git_data": true,
  "exclude_releases": false,
  "exclude_owner_projects": true
}

这两个 API 调用各会返回包含已启动迁移 ID 的 JSON 响应。

HTTP/1.1 201 Created

{
  "id": 123,
  // ...
}

更多信息请参阅 Start an organization migration

生成归档可能需要一些时间,取决于数据量。你可以使用 “Get an organization migration status” API 定期检查这两个迁移的状态,直至迁移的 state 变为 exported

GET /api/v3/orgs/acme-corp/migrations/123 HTTP/1.1
Accept: application/vnd.github+json
Authorization: Bearer <TOKEN>
Host: github.acmecorp.net

HTTP/1.1 200 OK
Content-Type: application/json

{
  "id": 123,
  "state": "exported",
  // ...
}

更多信息请参阅 Get an organization migration status

注意

如果迁移进入 failed 状态而非 exported,请尝试重新启动迁移。若迁移反复失败,我们建议使用 ghe-migrator 生成归档,而非使用 API。

按照 Exporting migration data from your enterprise 中的步骤进行操作,仅向迁移中添加一个仓库。过程结束后,你将拥有包含 Git 源和元数据的单个迁移归档,然后即可进入本文的第 6 步。

当迁移的 state 变为 exported 后,可使用 “Download an organization migration archive” API 获取迁移的 URL。

GET /api/v3/orgs/acme-corp/migrations/123/archive HTTP/1.1
Accept: application/vnd.github+json
Authorization: Bearer <TOKEN>
Host: github.acmecorp.net

HTTP/1.1 302 Found
Location: https://media.github.acmecorp.net/migrations/123/archive/cca2ebe9-7403-4ffa-9b6a-4c9e16c94410?token=AAAAABEWE7JP4H2HACKEGMTDOYRC6

该 API 将返回 302 Found 响应,并在 Location 头部提供可下载归档的 URL。下载两个文件:一个为 Git 源,另一个为元数据。

更多信息请参阅 Download an organization migration archive

在两个迁移完成并下载归档后,可进入下一步。

步骤 6:上传迁移归档

要将数据导入 GitHub Enterprise Cloud,必须使用我们的 GraphQL API 将每个仓库的两个归档(Git 源和元数据)从本地机器传输至 GitHub。

如果使用 GitHub Enterprise Server 3.7 或更低版本,需先生成 GitHub 可访问的归档 URL。大多数客户会将归档上传至云提供商的 Blob 存储服务(如 Amazon S3 或 Azure Blob Storage),然后为每个归档生成短期 URL。

如果使用 GitHub Enterprise Server 3.8 或更高版本,实例会自行上传归档并生成 URL。上一步的 Location 头部会返回该短期 URL。

可能需要将 GitHub 的 IP 段列入白名单。更多信息请参阅 Managing access for a migration between GitHub products

将迁移归档上传至 GitHub 拥有的 Blob 存储

如果使用 GitHub 拥有的 Blob 存储,你将按照以下流程将归档上传至该存储

  1. 通过提交 POST 请求创建分段上传(multipart upload)
  2. 使用 PATCH 请求将归档分为最多 100MB 的多个部分上传
  3. 提交 PUT 请求完成上传

1. 创建分段上传

你将向以下地址提交 POST 请求

https://uploads.github.com/organizations/{organization_id}/gei/archive/blobs/uploads

在请求体中包含如下 JSON,注明归档名称和大小。所有上传的 Content-Type 均可保持为 "application/octet-stream"。

{
"content_type": "application/octet-stream",
"name": "git-archive.tar.gz",
"size": 262144000
}

这将返回如下 JSON 对象响应

{
  "guid": "363b2659-b8a3-4878-bfff-eed4bcb54d35",
  "node_id": "MA_kgDaACQzNjNiMjY1OS1iOGEzLTQ4NzgtYmZmZi1lZWQ0YmNiNTRkMzU",
  "name": "git-archive.tar.gz",
  "size": 33287,
  "uri": "gei://archive/363b2659-b8a3-4878-bfff-eed4bcb54d35",
  "created_at": "2024-11-13T12:35:45.761-08:00"
}

该 URI 代表已上传的归档,在启动仓库迁移时将用于排队迁移。响应还会在响应头中提供用于下一步使用 PATCH 请求上传文件分片的 location。

/organizations/{organization_id}/gei/archive/blobs/uploads?part_number=1&guid=<guid>&upload_id=<upload_id>

2. 分段上传归档

使用先前响应头中提供的 location,使用 PATCH 请求每次上传最多 100 MB 的文件部分,确保原始数据直接放在请求体中,不使用 multipart form。如果文件的最后一部分不足 100 MB,则仅在最后一次请求中上传剩余字节。

https://uploads.github.com/{location}

这将返回空响应体,并在响应头中提供以下 location

/organizations/{organization_id}/gei/archive/blobs/uploads?part_number=2&guid=<guid>&upload_id=<upload_id>

重复以上步骤直至上传完成。每次读取最多 100 MB 的文件,并使用递增的 part_number 值将请求发送至新返回的 location。

3. 完成上传

向上一部中返回的 “last path” 值提交一个空体的 PUT 请求,即完成对 GitHub 拥有存储的上传。GEI URI 可使用此初始 POST 请求返回的 GUID 按以下格式构造

gei://archive/{guid}

步骤 7:启动仓库迁移

当您启动迁移时,单个仓库及其相关数据将迁移到您指定的全新 GitHub 仓库中。

如果您想一次从同一来源组织迁移多个仓库,可以排队多个迁移。您最多可以同时运行 5 个仓库迁移。

startRepositoryMigration 变更

mutation startRepositoryMigration (
  $sourceId: ID!,
  $ownerId: ID!,
  $repositoryName: String!,
  $continueOnError: Boolean!,
  $accessToken: String!,
  $githubPat: String!,
  $gitArchiveUrl: String!,
  $metadataArchiveUrl: String!,
  $sourceRepositoryUrl: URI!,
  $targetRepoVisibility: String!
){
  startRepositoryMigration( input: {
    sourceId: $sourceId,
    ownerId: $ownerId,
    repositoryName: $repositoryName,
    continueOnError: $continueOnError,
    accessToken: $accessToken,
    githubPat: $githubPat,
    targetRepoVisibility: $targetRepoVisibility
    gitArchiveUrl: $gitArchiveUrl,
    metadataArchiveUrl: $metadataArchiveUrl,
    sourceRepositoryUrl: $sourceRepositoryUrl,
  }) {
    repositoryMigration {
      id
      migrationSource {
        id
        name
        type
      }
      sourceUrl
    }
  }
}
查询变量描述
sourceId您从 createMigrationSource 变更返回的迁移来源 id
ownerId您在 GitHub Enterprise Cloud 上的组织 ID。
repositoryName一个自定义的唯一仓库名称,当前在 GitHub Enterprise Cloud 上的组织所拥有的仓库中未被使用。当迁移完成或停止时,将在此仓库中创建一个错误日志 issue。
continueOnError迁移设置,允许在遇到不会导致迁移失败的错误时继续迁移。必须为 truefalse。我们强烈建议将 continueOnError 设置为 true,这样除非 Importer 无法移动 Git 源或失去连接且无法重新连接完成迁移,否则迁移将继续进行。
githubPat您在 GitHub Enterprise Cloud 上的目标组织的个人访问令牌。
accessToken您来源的个人访问令牌。
targetRepoVisibility新仓库的可见性。必须为 privatepublicinternal。如果未设置,仓库将以私有方式迁移。
gitArchiveUrl可被 GitHub Enterprise Cloud 访问的 Git 源归档 URL。
metadataArchiveUrl可被 GitHub Enterprise Cloud 访问的元数据归档 URL。
sourceRepositoryUrl你在 GitHub Enterprise Server 实例上的仓库 URL。此项为必填,但 GitHub Enterprise Cloud 不会直接与 GitHub Enterprise Server 实例通信。

有关个人访问令牌的要求,请参阅 管理 GitHub 产品之间迁移的访问权限

在下一步中,您将使用 startRepositoryMigration 变更返回的迁移 ID 来检查迁移状态。

步骤 8:检查迁移状态

为了检测任何迁移失败并确保迁移正常工作,您可以使用 getMigration 查询检查迁移状态。您还可以使用 getMigrations 检查多个迁移的状态。

getMigration 查询将返回状态,告知迁移是 queued(已排队)、in progress(进行中)、failed(失败)还是 completed(已完成)。如果迁移失败,Importer 将提供失败原因。

getMigration 查询

query (
  $id: ID!
){
  node( id: $id ) {
    ... on Migration {
      id
      sourceUrl
      migrationSource {
        name
      }
      state
      failureReason
    }
  }
}
查询变量描述
id您迁移的 id,该 ID 由 startRepositoryMigration 变更返回。

步骤 9:验证迁移并检查错误日志

要完成迁移,我们建议您检查 “Migration Log” issue。该 issue 会在目标仓库的 GitHub 中创建。

Screenshot of an issue with the title "Migration Log." The second comment in the issue includes logs for a migration.

最后,建议您检查已迁移的仓库,以确保其完整性。

步骤 1:安装 GitHub CLI 的 GEI 扩展

如果这是您第一次迁移,您需要安装 GitHub CLI 的 GEI 扩展。有关 GitHub CLI 的更多信息,请参阅 关于 GitHub CLI

或者,您也可以从 发布页面 下载 github/gh-gei 仓库的独立二进制文件。下载后可直接运行该二进制文件,无需使用 gh 前缀。

  1. 安装 GitHub CLI。有关 GitHub CLI 的安装说明,请参阅 GitHub CLI 仓库

    注意

    您需要 GitHub CLI 版本 2.4.0 或更高。可使用 gh --version 命令检查已安装的版本。

  2. 安装 GEI 扩展。

    Shell
    gh extension install github/gh-gei
    

任何需要 GEI 扩展帮助的情况下,都可以在命令后使用 --help 标志。例如,gh gei --help 将列出所有可用命令,gh gei migrate-repo --help 将列出 migrate-repo 命令的所有选项。

步骤 2:更新 GitHub CLI 的 GEI 扩展

GEI 扩展每周更新一次。为确保使用最新版本,请更新该扩展。

gh extension upgrade github/gh-gei

步骤 3:设置环境变量

在使用 GEI 扩展迁移至 GitHub Enterprise Cloud 之前,您必须创建能够访问源组织和目标组织的个人访问令牌,然后将这些令牌设置为环境变量。

  1. 创建并记录一个(经典)个人访问令牌,用于对 GitHub Enterprise Cloud 上的目标组织进行身份验证,确保该令牌满足所有要求。有关详细信息,请参阅 管理 GitHub 产品之间迁移的访问权限

  2. 创建并记录一个个人访问令牌,用于对源组织进行身份验证,同样确保该令牌满足所有相同要求。

  3. 为个人访问令牌设置环境变量,在下面的命令中将 TOKEN 替换为您上面记录的令牌。对目标组织使用 GH_PAT,对源组织使用 GH_SOURCE_PAT

    • 如果您使用 Terminal,请使用 export 命令。

      Shell
      export GH_PAT="TOKEN"
      export GH_SOURCE_PAT="TOKEN"
      
    • 如果您使用 PowerShell,请使用 $env 命令。

      Shell
      $env:GH_PAT="TOKEN"
      $env:GH_SOURCE_PAT="TOKEN"
      
  4. 如果您正在迁移到具有数据驻留的 GitHub Enterprise Cloud,为方便起见,请为您企业的 基础 API URL 设置环境变量。

    确保将 SUBDOMAIN 替换为您企业的子域。例如,如果企业子域为 acme,则 TARGET_API_URL 的值应为 https://api.acme.ghe.com

    • 如果您使用 Terminal,请使用 export 命令。

      Shell
      export TARGET_API_URL="https://api.SUBDOMAIN.ghe.com"
      
    • 如果您使用 PowerShell,请使用 $env 命令。

      Shell
      $env:TARGET_API_URL="https://api.SUBDOMAIN.ghe.com"
      

    您将在使用 GitHub CLI 运行的命令中,通过 --target-api-url 选项使用此变量。

步骤 4:设置 Blob 存储

使用 GitHub 拥有的 Blob 存储迁移仓库

如果你不想为 GitHub Enterprise Importer 设置并提供客户拥有的 Blob 存储账户来存放仓库归档,也可以使用 GitHub 拥有的 Blob 存储进行迁移。为此,需要运行 GitHub CLI 的 GEI 扩展 v1.9.0(或更高)。GitHub 拥有的 Blob 存储无需额外设置,可在运行 GitHub CLI 的 GEI 扩展命令时作为选项使用。

出于安全考虑,GitHub 托管的 Blob 存储仅限写入,无法下载。迁移完成后,仓库归档会立即被删除。如果归档已上传但未在迁移中使用,则该归档将在 7 天后被删除。

使用 CLI 标志启用 GitHub 拥有的 Blob 存储时,仓库归档会自动导出到管理控制台中配置的目标位置,上传至 GitHub 拥有的存储,并导入到迁移目标。使用 GitHub 拥有的 Blob 存储时,我们建议配置本地存储。请参阅 Using local storage (GHES 3.16+)

使用客户拥有的 Blob 存储迁移仓库

必须将仓库数据存放在 GitHub 可访问的位置。如果 GitHub Enterprise Server 实例位于防火墙后,可能需要使用外部云服务设置 Blob 存储。

首先,需要使用受支持的提供商设置 Blob 存储。随后,如果使用云提供商,则必须在管理控制台或 GitHub CLI 中配置该存储提供商的凭据。

GitHub CLI 支持以下 Blob 存储提供商

  • Amazon Web Services(AWS)S3

  • Azure Blob Storage

  • GHES 实例上的本地存储(GHES 3.16 及以上)。我们建议在使用 GitHub 拥有的 Blob 存储时采用此选项。

设置 AWS S3 存储桶

在 AWS 中,创建一个 S3 存储桶。更多信息,请参阅 AWS 文档中的《创建存储桶》。

您还需要具有以下权限的 AWS 访问密钥和秘密密钥

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::github-migration-bucket",
                "arn:aws:s3:::github-migration-bucket/*"
            ]
        }
    ]
}

注意

GitHub Enterprise Importer 在迁移完成后不会删除您在 AWS 上的归档。为降低存储成本,我们建议配置归档的自动删除。更多信息,请参阅 AWS 文档中的《在存储桶上设置生命周期配置》。

设置 Azure Blob Storage 存储账户

在 Azure 中,创建一个存储账户并记录下连接字符串。更多信息,请参阅 Microsoft 文档中的《管理存储账户访问密钥》。

注意

GitHub Enterprise Importer 在迁移完成后不会删除您在 Azure Blob Storage 上的归档。为降低存储成本,我们建议配置归档的自动删除。更多信息,请参阅 Microsoft 文档中的《通过自动管理数据生命周期来优化成本》。

使用本地存储(GHES 3.16+)

使用本地存储运行迁移时,归档数据会写入 GitHub Enterprise Server 实例的磁盘,无需云存储提供商。

  • 如果没有防火墙规则阻止 GitHub Enterprise Server 的出站流量,GitHub Enterprise Importer 可以自动从 GitHub Enterprise Server 检索已存储的归档。
  • 如果已设置防火墙规则且不希望允许 GitHub Enterprise Importer 访问,你可以将归档数据上传到 GitHub 拥有的 Blob 存储,以供 GitHub Enterprise Importer 访问。要手动执行此操作,请参阅本文 API 版本中的 Uploading your migration archives to GitHub-owned blob storage
  1. 在 GitHub Enterprise Server 的管理账户上,任意页面的右上角,点击.
  2. 在 "Site admin\" 侧边栏,点击 Management Console
  3. 登录管理控制台。
  4. 在左侧边栏,点击 Migrations
  5. 点击 Enable GitHub Migrations
  6. 在 “Migrations Storage” 下,点击 Local Storage
  7. 点击 Save settings

执行迁移时,请监控 GitHub Enterprise Server 的磁盘空间。迁移归档会在 7 天后自动删除。若要释放空间,你可以使用 REST API 端点(组织迁移) 删除归档。

配置你的 Blob 存储凭据

如果使用 云提供商(而非本地存储)设置 Blob 存储,则必须在 GitHub 中配置该存储提供商的凭据

  • 如果使用 GitHub Enterprise Server 3.8 或更高版本,请在管理控制台中配置凭据。
  • 如果使用 GitHub Enterprise Server 3.7 或更低版本,请在 GitHub CLI 中配置凭据。

在 GitHub Enterprise Server 实例的管理控制台中配置 Blob 存储

注意

仅在使用 GitHub Enterprise Server 3.8 或更高版本时才需在管理控制台配置 Blob 存储。如使用 3.7 或更低版本,请改在 GitHub CLI 中配置凭据。

在设置好 AWS S3 存储桶或 Azure Blob Storage 账户后,需要在 GitHub Enterprise Server 实例的管理控制台中配置 Blob 存储。有关管理控制台的更多信息,请参阅 Administering your instance from the Management Console

  1. 在 GitHub Enterprise Server 的管理账户上,任意页面的右上角,点击.

  2. 如果尚未在 “Site admin” 页面,左上角点击 Site admin

  3. 在 "Site admin\" 侧边栏,点击 Management Console

  4. 登录管理控制台。

  5. 在顶部导航栏,点击 Settings

  6. Migrations 下,点击 Enable GitHub Migrations

  7. 可选地,若要导入为 GitHub Actions 配置的存储设置,选择 Copy Storage settings from Actions。更多信息请参阅 Enabling GitHub Actions with Azure Blob storageEnabling GitHub Actions with Amazon S3 storage

    注意

    复制存储设置后,仍可能需要更新云存储账户的配置,以便与 GitHub Enterprise Importer 配合使用。尤其要确保已将 GitHub 的 IP 地址列入白名单。更多信息请参阅 Managing access for a migration between GitHub products

  8. 如果未从 GitHub Actions 导入存储设置,请选择 Azure Blob Storage 或 Amazon S3 并填写必填信息。

    注意

    如果使用 Amazon S3,则必须将 “AWS Service URL” 设置为存放桶所在 AWS 区域的标准终端。例如,若桶位于 eu-west-1 区域,则 “AWS Service URL” 为 https://s3.eu-west-1.amazonaws.com。你的 GitHub Enterprise Server 实例网络必须能够访问此主机。网关终端(gateway endpoints)不受支持,例如 bucket.vpce-0e25b8cdd720f900e-argc85vg.s3.eu-west-1.vpce.amazonaws.com。有关网关终端的更多信息,请参阅 AWS 文档中的 Gateway endpoints for Amazon S3

  9. 点击 Test storage settings

  10. 点击 Save settings

在 GitHub CLI 中配置 Blob 存储凭据

注意

仅在使用 GitHub Enterprise Server 3.7 或更低版本时才需在 GitHub CLI 中配置 Blob 存储凭据。如使用 3.8 或更高版本,请改在管理控制台中配置。

如果在 GitHub CLI 中配置 Blob 存储凭据,将无法执行 Git 源或元数据导出超过 2GB 的迁移。若需进行此类迁移,请升级至 GitHub Enterprise Server 3.8 或更高版本。

在 GitHub CLI 中配置 AWS S3 凭据

准备运行迁移时,您需要向 GitHub CLI 提供 AWS 凭证:区域、访问密钥、秘密密钥以及(如有)会话令牌。您可以通过参数传递这些信息,或将其设置为名为 AWS_REGIONAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN 的环境变量。

您还需要使用 --aws-bucket-name 参数传入 S3 存储桶的名称。

在 GitHub CLI 中配置 Azure Blob Storage 账户凭据

准备运行迁移时,您可以将连接字符串作为参数传入 GitHub CLI,或使用名为 AZURE_STORAGE_CONNECTION_STRING 的环境变量传入。

允许网络访问

如果在存储账户上配置了防火墙规则,请确保已允许迁移目标的 IP 段访问。参见 Managing access for a migration between GitHub products

步骤 5:生成迁移脚本

如果您想一次性将多个仓库迁移到 GitHub Enterprise Cloud,请使用 GitHub CLI 生成迁移脚本。生成的脚本将包含每个仓库对应的迁移命令列表。

注意

生成脚本会输出一个 PowerShell 脚本。如果您使用终端,需要将脚本保存为 .ps1 扩展名,并为 MacLinux 安装 PowerShell 才能运行它。

如果只迁移单个仓库,请直接跳到下一步。

生成迁移脚本

此步骤必须在能够访问 GitHub Enterprise Server 实例 API 的计算机上执行。如果能在浏览器中访问实例,则说明该计算机具备相应访问权限。

要生成迁移脚本,请运行 gh gei generate-script 命令。

对于 GitHub Enterprise Server 3.8 及以上,或在使用 Azure Blob Storage 的 3.7 或更低版本时,使用以下标志

Shell
gh gei generate-script --github-source-org SOURCE \
  --github-target-org DESTINATION \
  --output FILENAME \
  --ghes-api-url GHES-API-URL

如果在使用 AWS S3 的 3.7 或更低版本时,使用以下标志

Shell
gh gei generate-script --github-source-org SOURCE \
  --github-target-org DESTINATION \
  --output FILENAME \
  --ghes-api-url GHES-API-URL \
  --aws-bucket-name AWS-BUCKET-NAME

占位符

将上述命令中的占位符替换为以下值。

占位符
SOURCE源组织的名称
DESTINATION目标组织的名称
FILENAME生成的迁移脚本文件名

如果您使用终端,请使用 .ps1 文件扩展名,因为生成的脚本需要 PowerShell 才能运行。您可以为 MacLinux 安装 PowerShell。
GHES-API-URL你的 GitHub Enterprise Server 实例 API 的 URL,例如 https://myghes.com/api/v3
AWS-BUCKET-NAME您 AWS S3 存储桶的名称

附加参数

参数描述
--download-migration-logs下载每个已迁移仓库的迁移日志。有关迁移日志的更多信息,请参阅 获取 GitHub Enterprise Importer 迁移日志
--lock-source-repo迁移时锁定源仓库。警告:锁定源仓库会阻止进一步更改,可能会中断工作流。仅在确定合适时才建议使用此选项。更多信息请参阅 About locked repositories
--no-ssl-verify如果你的 GitHub Enterprise Server 实例使用自签名或无效的 SSL 证书,请使用 --no-ssl-verify 标志。使用此标志时,GitHub CLI 仅在从实例提取数据时跳过 SSL 证书验证,其他调用仍会验证 SSL。
--skip-releases如果您的仓库拥有超过 10 GB 的发行版数据,发行版将无法迁移。使用 --skip-releases 标志可在不迁移发行版的情况下迁移仓库。
--target-api-url TARGET-API-URL如果您迁移到 GHE.com,请添加 --target-api-url TARGET-API-URL,其中 TARGET-API-URL 是您企业子域的基础 API URL。例如:https://api.octocorp.ghe.com
--use-github-storage使用 GitHub 拥有的 Blob 存储作为中间存储解决方案执行仓库迁移。

审查迁移脚本

生成脚本后,请审查该文件,并可选择编辑脚本。

  • 如果有不想迁移的仓库,请删除或注释掉相应的行。
  • 如果您希望某些仓库在目标组织中使用不同的名称,请更新相应 --target-repo 标志的值。
  • 如果您想更改新仓库的可见性,请更新相应 --target-repo-visibility 标志的值。默认情况下,脚本会将可见性设置为与源仓库相同。

如果您的仓库拥有超过 10 GB 的发行版数据,发行版将无法迁移。使用 --skip-releases 标志可在不迁移发行版的情况下迁移仓库。

如果您下载的是独立二进制文件而非 GitHub CLI 的扩展,则需要编辑生成的脚本,使其运行该二进制文件而不是 gh gei

步骤 6:迁移仓库

您可以使用迁移脚本一次迁移多个仓库,也可以使用 gh gei migrate-repo 命令迁移单个仓库。

迁移仓库时,GitHub CLI 的 GEI 扩展会执行以下步骤

  1. 连接到你的 GitHub Enterprise Server 实例,为每个仓库生成两个迁移归档,一个用于 Git 源,一个用于元数据
  2. 将迁移归档上传至您选择的 Blob 存储提供商
  3. 使用存储在 Blob 存储提供商处的归档 URL,在 GitHub Enterprise Cloud 中启动迁移
  4. 从本地机器删除迁移归档

迁移多个仓库

如果从 GitHub Enterprise Server 3.7 或更早版本迁移,在运行脚本前必须设置额外的环境变量以对 Blob 存储提供商进行身份验证。

  • 对于 Azure Blob Storage,请将 AZURE_STORAGE_CONNECTION_STRING 设置为您 Azure 存储账户的连接字符串。

    仅支持使用存储账户访问密钥的连接字符串。使用共享访问签名(SAS)的连接字符串不受支持。有关存储账户访问密钥的更多信息,请参阅 Azure 文档中的《管理存储账户访问密钥》。

  • 对于 AWS S3,请设置以下环境变量。

    • AWS_ACCESS_KEY_ID:您存储桶的访问密钥 ID
    • AWS_SECRET_ACCESS_KEY:您存储桶的密钥
    • AWS_REGION:存储桶所在的 AWS 区域
    • AWS_SESSION_TOKEN:会话令牌(如果您使用 AWS 临时凭证),详见 AWS 文档中的《使用临时凭证访问 AWS 资源》。

要迁移多个仓库,请运行您生成的脚本。将以下命令中的 FILENAME 替换为生成脚本时指定的文件名。

  • 如果您使用终端,请使用 ./

    Shell
    ./FILENAME
    
  • 如果您使用 PowerShell,请使用 .\

    Shell
    .\FILENAME
    

迁移单个仓库

此步骤必须在能够访问 GitHub Enterprise Server 实例 API 的计算机上执行。如果能在浏览器中访问实例,则说明该计算机具备相应访问权限。

要迁移单个仓库,请使用 gh gei migrate-repo 命令。

如果使用 GitHub Enterprise Server 3.8 或更高版本,请使用以下标志

Shell
gh gei migrate-repo --github-source-org SOURCE --source-repo CURRENT-NAME --github-target-org DESTINATION --target-repo NEW-NAME --ghes-api-url GHES-API-URL

如果从 GitHub Enterprise Server 3.7 或更早版本迁移且使用 Azure Blob Storage 作为 Blob 存储提供商,请使用以下标志进行身份验证

Shell
gh gei migrate-repo --github-source-org SOURCE --source-repo CURRENT-NAME --github-target-org DESTINATION --target-repo NEW-NAME \
    --ghes-api-url GHES-API-URL --azure-storage-connection-string "AZURE_STORAGE_CONNECTION_STRING"

如果从 GitHub Enterprise Server 3.7 或更早版本迁移且使用 Amazon S3 作为 Blob 存储提供商,请使用以下标志进行身份验证

Shell
gh gei migrate-repo --github-source-org SOURCE --source-repo CURRENT-NAME --github-target-org DESTINATION --target-repo NEW-NAME \
    --ghes-api-url GHES-API-URL --aws-bucket-name "AWS-BUCKET-NAME"

占位符

将上述命令中的占位符替换为以下值。

占位符
SOURCE源组织的名称
CURRENT-NAME要迁移的仓库名称
DESTINATION目标组织的名称
NEW-NAME迁移后仓库的新名称
GHES-API-URL你的 GitHub Enterprise Server 实例 API 的 URL,例如 https://myghes.com/api/v3
AZURE_STORAGE_CONNECTION_STRING你的 Azure 存储账户的连接字符串。

请务必为连接字符串加上引号,因为其中包含可能被 shell 解释的字符。
AWS-BUCKET-NAME您 AWS S3 存储桶的名称

附加参数

参数描述
--lock-source-repo迁移时锁定源仓库。更多信息请参阅 About locked repositories
--no-ssl-verify如果你的 GitHub Enterprise Server 实例使用自签名或无效的 SSL 证书,请使用 --no-ssl-verify 标志。使用此标志时,GitHub CLI 仅在从实例提取数据时跳过 SSL 证书验证,其他调用仍会验证 SSL。
--skip-releases如果您的仓库拥有超过 10 GB 的发行版数据,发行版将无法迁移。使用 --skip-releases 标志可在不迁移发行版的情况下迁移仓库。
--target-api-url TARGET-API-URL如果您迁移到 GHE.com,请添加 --target-api-url TARGET-API-URL,其中 TARGET-API-URL 是您企业子域的基础 API URL。例如:https://api.octocorp.ghe.com
--target-repo-visibility TARGET-VISIBILITY仓库默认以私有可见性迁移。若要设置可见性,可添加 --target-repo-visibility 标志,并指定 privatepublicinternal。如果迁移目标是拥有托管用户的企业,公共仓库不可用。
--use-github-storage使用 GitHub 拥有的 Blob 存储作为中间存储解决方案执行仓库迁移。

中止迁移

如果想取消迁移,请使用 abort-migration 命令,并将 MIGRATION-ID 替换为 migrate-repo 返回的 ID。

Shell
gh gei abort-migration --migration-id MIGRATION-ID

步骤 7:验证迁移并检查错误日志

迁移完成后,我们建议您查看迁移日志。更多信息请参阅 访问 GitHub Enterprise Importer 迁移日志

我们建议您对已迁移的仓库进行完整性检查。

迁移完成后,建议从存储容器中删除归档。如果计划执行其他迁移,请删除 ADO2GH 扩展放入存储容器的归档。若已完成所有迁移,可直接删除整个容器。

© . This site is unofficial and not affiliated with GitHub, Inc.