# 了解从 GitLab 迁移到 GitHub

GitHub Enterprise Importer 从 GitLab 自动迁移。

## 关于从 GitLab 迁移

可用于 GitHub Enterprise Importer 将存储库从 GitLab 迁移到 GitHub Enterprise Cloud （GitHub.com 或 GHE.com） 。

迁移是使用 GL2GH extension of the GitHub CLI迁移 API 的跨平台命令行包装器 GitHub 来执行的。 对于每个存储库，包括 GL2GH extension：

1. 将 GitLab 项目**导出**到`.tar.gz`包含 Git 存储库和项目元数据的存档（例如问题、合并请求、标签、里程碑和发布）。
2. 在本地运行命令的计算机上**暂存**存档。
3. 将存档**上传到**可从中读取的 Blob 存储GitHub（GitHub-owned blob storage或 AWS S3 或Azure Blob 存储中拥有的存储帐户）。
4. 将存档**导入**目标组织，将 GitLab 实体转换为其GitHub等效项。

在创建企业帐户 GitHub之前，请确定企业是否会使用 Enterprise Managed Users。 这会影响成员进行身份验证的方式以及管理标识和访问的方式。 请参阅“[为 GitHub Enterprise Cloud 选择企业类型](/zh/enterprise-cloud@latest/enterprise-onboarding/getting-started-with-your-enterprise/choose-an-enterprise-type)”。

## 支持的 GitLab 版本

可以从 GitLab.com 和自托管 GitLab 实例迁移。

GitHub Enterprise Importer 支持当前维护的 GitLab 版本（非生命周期结束）。 有关维护的版本列表，请参阅 GitLab 文档中 [的支持声明](https://docs.gitlab.com/policy/maintenance/) 。 旧版本尚未测试或评估。

## 迁移的数据

当 GitLab 导出存档中存在数据时， GitHub Enterprise Importer 请将以下数据从 GitLab GitHub Enterprise Cloud迁移到 。

* Git 源（包括提交历史记录）和存储库 Wiki
* 提交注释
* Project完全映射的配置，例如默认分支
* 问题和问题注释，包括问题状态和里程碑事件
  * 线程讨论将迁移为具有原始线程上下文的平面注释
* 合并请求，这些请求转换为拉取请求，包括：
  * 注释（仅在存在差异数据时迁移为审阅批注，否则为平面问题批注;仅导出中存在最新的差异）
  * 审阅者和审批者
  * 合并请求状态事件
* 里程碑
* 时间线事件
* 表情符号反应
* 上传（附件）
* 发布和发布资产
* Project成员（迁移为模特）

## 不迁移的数据

不会迁移以下数据。

* Git LFS 对象：指针文件随 Git 历史记录一起传输，但必须将二进制对象单独推送到迁移目标，作为后续任务。 有关详细信息，请参阅“[复制一个仓库](/zh/repositories/creating-and-managing-repositories/duplicating-a-repository#mirroring-a-repository-that-contains-git-large-file-storage-objects)”。
* 存储库策略，包括合并训练、管道入口、所需审批、主题、虚拟形象和镜像
* 组设置和组成员身份
* 代码段、发行板、时间跟踪数据和设计管理数据
* CI/CD 管道和管道计划（`.gitlab-ci.yml` 没有自动 GitHub Actions 等效项）
* 漏洞报告
* GitLab 根本不包含在导出中的数据，例如 Webhook、CI/CD 变量、作业跟踪和项目、子管道历史记录和管道触发器

## 迁移数据的限制

可以迁移的 GitHub Enterprise Importer 是有限的。 有些是由于GitHub的限制，而另一些是GitHub Enterprise Importer本身的限制。

### 局限性GitHub

* **单个 Git 提交的 2 GiB 大小限制：** Git 存储库中的单个提交不能大于 2 GiB。 如果您的任何提交大于 2 GiB，您需要将该提交拆分为每个 2 GiB 或更小的提交。
* **单个推送的 2 GiB 大小限制：** 单个推送不能大于 2 GiB。 较大的推送失败并出现 `pack exceeds maximum allowed size` 错误。
* **Git 引用的 255 字节限制：** 任何通常称为“ref”的 Git 引用的名称不能大于 255 字节。 通常，这意味着引用长度不能超过 255 个字符，但任何非 ASCII 字符（如表情符号）可能会使用多个字节。 如果任何 Git 引用太长，将返回明确的错误消息。
* **100 MiB 文件大小限制：** 完成迁移后，Git 存储库中的单个文件不能大于 100 MiB。 在存储库迁移期间，此限制将增加到 400 MiB。 请考虑用于 Git LFS 存储大型文件。

### 局限性GitHub Enterprise Importer

* Git 存储库的大小限制为 40 GB (公开预览)：此限制仅适用于源代码\*\*\*\*。 若要检查存储库存档是否超出限制，请使用 [git-sizer](https://github.com/github/git-sizer) 工具并查看输出中的 blob 总大小。 git-sizer 工具还有助于识别与大型文件、blob 大小、提交大小和可能影响迁移的树计数相关的潜在问题。
* **400 MiB 文件大小限制：** 迁移包含的 GitHub Enterprise Importer存储库时，Git 存储库中的单个文件不能大于 400 MiB。 请考虑使用 Git LFS 来存储大型文件。
* \*\*Git LFS对象未迁移：\*\*Importer可以迁移使用Git LFS的存储库，但 LFS 对象本身不会被迁移。 迁移完成后，可以将其作为后续任务推送到迁移目标。
* 延迟的代码搜索功能：迁移存储库后，重新编制搜索索引可能需要几个小时，在重新编制索引完成前，代码搜索可能会返回意外的结果。
* 为组织配置的规则集可能会导致迁移失败：例如，如果配置的规则要求提交作者的电子邮件地址以 \*\*\*\* 结尾，而要迁移的存储库包含不符合此规则的提交，则迁移将失败。
* **模特内容可能不可搜索**：模特是与导入内容（如问题、拉取请求、注释等）关联的占位符用户。 在搜索与模型关联的内容（例如已分配的事项）时，可能无法找到这些事项。 回收模特后，即可通过新所有者获取内容。

### GitLab 的限制

* **GitLab 导出存档的 40 GB 限制：** GitLab 的项目导出 API 不会在 GitLab.com 上生成大于 40 GB 的存档。
  GitHub与源大小限制不同，这适用于整个导出存档，包括项目元数据以及 Git 源。 此限制由 GitLab 设置，在自托管实例上可能有所不同。