# 将存储库从 GitLab 迁移到 GitHub

执行试用运行，然后将存储库从 GitLab 迁移到 GitHub。

## Prerequisites

* 您必须已完成本指南的所有先前阶段。
* 必须启用 GitLab 项目才能导出。 请参阅 GitLab 文档中有关导入 [的项目导出](https://docs.gitlab.com/administration/settings/import_and_export_settings/#enable-project-export) 和 [Sidekiq 配置](https://docs.gitlab.com/administration/sidekiq/configuration_for_imports/) 。
* 确保了解将要迁移的数据以及导入程序已知的支持限制。 有关详细信息，请参阅 [了解从 GitLab 迁移到 GitHub](/zh/migrations/using-github-enterprise-importer/migrate-from-gitlab/understand-migrations)。
* 虽然并非必需，但建议在生产迁移期间停止工作。 Importer 不支持增量迁移，因此迁移期间发生的任何更改都不会迁移。 如果选择在生产迁移期间不停止工作，需要手动迁移这些更改。

## 执行试用运行

为了帮助发现企业可能特有的问题，我们因此强烈建议进行迁移的试运行。 通过试用运行，你将了解：

* 给定存储库的迁移是否可以成功完成。
* 是否可以将迁移的存储库恢复为可行的状态。
* 迁移运行需要多长时间。

试用版运行可以随时进行，在迁移期间无需停止工作。 为了减少完成试迁移所需的时间，可以计划连续安排试运行的批次。 然后，这些存储库的用户可以在自己方便的时候进行结果验证。

1. 为试验性迁移创建测试组织。

   可以将单个组织用于所有试运行，也可以为每个预期目标组织创建一个测试组织。 请考虑在组织名称的末尾添加 `-sandbox`，以阐明组织仅用于迁移验证，而不适用于生产。 完成后，可以删除测试组织。

2. 运行测试迁移。

3. 确认你能够在 [后续任务](/zh/migrations/using-github-enterprise-importer/migrate-from-gitlab/follow-up-tasks) 中完成后续任务。

4. 要求用户验证迁移结果。

5. 解决试验性迁移发现的任何问题。

6. （可选）删除测试组织。

## 迁移单个存储库

若要迁移一个存储库，请使用 `gh gl2gh migrate-repo` 命令。

```shell copy
gh gl2gh migrate-repo \
  --gitlab-server-url GITLAB_SERVER_URL \
  --gitlab-group SOURCE_GROUP \
  --gitlab-project SOURCE_PROJECT \
  --github-org DESTINATION \
  --github-repo NEW_REPO_NAME \
  --use-github-storage
```

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

| 占位符                 | Value                                                                    |
| ------------------- | ------------------------------------------------------------------------ |
| GITLAB\_SERVER\_URL | GitLab 实例的完整 URL，例如 `https://gitlab.com` 或 `https://gitlab.example.com`。 |
| SOURCE\_GROUP       | 包含项目的组或命名空间的完整路径。 对于嵌套子组，请使用完整路径，例如 `parent-group/subgroup`。             |
| SOURCE\_PROJECT     | 要迁移的 GitLab 项目。                                                          |
| 目的地                 | 目标组织。GitHub                                                              |
| NEW\_REPO\_NAME     | 上 GitHub存储库的名称。                                                          |

如果未使用 GitHub-owned blob storage，请参阅 [配置 Blob 存储](/zh/migrations/using-github-enterprise-importer/migrate-from-gitlab/configure-storage)。

### 其他参数

| Argument                                  | Description                                                                                                                                                                                            |
| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `--target-repo-visibility`                | 将新存储库的可见性设置为`public`或 `private``internal`。 默认值为 `private`.                                                                                                                                             |
| `--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-uploads-url TARGET-UPLOADS-URL` | 如果要迁移到 GHE.com 和使用 GitHub-owned blob storage，请添加 `--target-uploads-url TARGET-UPLOADS-URL`目标UPLOADS-URL 是企业子域的基本上传 API URL。 例如： `https://uploads.octocorp.ghe.com`。 这默认为 `https://uploads.github.com`。 |
| `--no-ssl-verify`                         | 在与 GitLab 实例进行会谈时 GL2GH extension 禁用 SSL 验证。 仅当 GitLab 实例使用自签名证书时，才使用此证书。 所有其他步骤仍验证 SSL。                                                                                                               |
| `--archive-url URL`                       | 从 URL 导入以前导出的存档，而不是从 GitLab 导出项目。                                                                                                                                                                      |
| `--archive-path PATH`                     | 从本地文件路径导入以前导出的存档，而不是再次从 GitLab 导出项目。                                                                                                                                                                   |
| `--keep-archive`                          | 在本地保留导出存档，而不是在成功上传后将其删除。                                                                                                                                                                               |

## 生成迁移脚本

如果要一次性将多个存储库 GitHub Enterprise Cloud 迁移到其中，请使用 GitHub CLI 该脚本生成迁移脚本。 生成的脚本每个存储库包含一个 `migrate-repo` 命令。

若要生成迁移脚本，请运行 `gh gl2gh generate-script` 命令。

```shell copy
gh gl2gh generate-script \
  --gitlab-server-url GITLAB_SERVER_URL \
  --github-org DESTINATION \
  --output FILENAME \
  --use-github-storage
```

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

| 占位符                 | Value                                                                                                                                                                                                                                                                                                                                           |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| GITLAB\_SERVER\_URL | GitLab 实例的完整 URL，例如 `https://gitlab.com` 或 `https://gitlab.example.com`。                                                                                                                                                                                                                                                                        |
| 目的地                 | 目标组织。GitHub                                                                                                                                                                                                                                                                                                                                     |
| FILENAME            | 生成的迁移脚本的文件名<br><br>如果使用终端，请使用 `.ps1` 文件扩展名，因为生成的脚本需要 PowerShell 才能运行。 可以安装适用于 [Mac](https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.2) 或 [Linux](https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux?view=powershell-7.2) 的 PowerShell。 |

默认情况下，该脚本包含令牌可以访问的每个项目。 若要限定脚本的范围，请添加 `--gitlab-group GROUP`或 `--gitlab-group GROUP --gitlab-project PROJECT` 用于单个项目。

如果未使用 GitHub-owned blob storage，请参阅 [配置 Blob 存储](/zh/migrations/using-github-enterprise-importer/migrate-from-gitlab/configure-storage)。

### 其他参数

| Argument                                  | Description                                                                                                                                                                                            |
| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `--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-uploads-url TARGET-UPLOADS-URL` | 如果要迁移到 GHE.com 和使用 GitHub-owned blob storage，请添加 `--target-uploads-url TARGET-UPLOADS-URL`目标UPLOADS-URL 是企业子域的基本上传 API URL。 例如： `https://uploads.octocorp.ghe.com`。 这默认为 `https://uploads.github.com`。 |

### 查看迁移脚本

生成脚本后，查看文件，并根据需要编辑脚本。

* 如果有任何不想迁移的存储库，请删除或注释掉相应的行。
* 如果希望任何存储库在目标组织中具有不同的名称，请更新相应 `--github-repo` 标志的值。
* 如果要更改新存储库的可见性，请添加或更新相应的 `--target-repo-visibility` 标志。

### 迁移存储库

如果试用运行成功，并且能够完成后续任务，则可以继续执行实际迁移。

> \[!WARNING] 建议停止正在迁移的存储库中的工作。 迁移期间或之后所做的任何更改都需要手动迁移。

运行生成的脚本。 将以下命令中的 FILENAME 替换为生成脚本时提供的文件名。

* 如果使用终端，请使用 `./`。

  ```shell copy
  ./FILENAME
  ```

* 如果使用 PowerShell，请使用 `.\`。

  ```shell copy
  .\FILENAME
  ```