# 从 GitHub Enterprise Server 导出迁移数据

若要更改平台或从试用实例移动到生产实例，可以通过准备实例、锁定存储库和生成迁移存档，从 GitHub Enterprise Server 实例导出迁移数据。

## GitHub Enterprise Server准备源实例

1. 验证你是源上的 GitHub Enterprise Server 站点管理员。 执行此操作的最佳方法是验证是否可以[通过 SSH 连接到实例](/zh/enterprise-server@3.22/admin/administering-your-instance/administering-your-instance-from-the-command-line/accessing-the-administrative-shell-ssh)。

2. [生成访问令牌](/zh/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)，具有 `repo` 和 `admin:org` 范围 在源实例上 GitHub Enterprise Server 。

3. 为尽量减少停机，请创建要从源实例导出的仓库列表。 您可以使用每行列出一个仓库 URL 的文本文件一次性导出多个仓库。

## 导出 GitHub Enterprise Server 源存储库

> \[!NOTE]
> 锁定存储库会阻止对存储库的所有写入访问。 您不能将新团队或协作者与锁定的仓库相关联。
>
> 如果您执行的试用版，则无需锁定仓库。 从正在使用的存储库迁移数据时，GitHub 强烈建议锁定存储库。 有关详细信息，请参阅“[关于 ghe-migrator](/zh/migrations/using-ghe-migrator/about-ghe-migrator#types-of-migrations)”。

1. 通过 SSH 连接到 GitHub.com。 如果实例包含多个节点，例如，如果配置了高可用性或异地复制，则通过 SSH 连接到主节点。 如果使用群集，则可以通过 SSH 连接到任何节点。 将 HOSTNAME 替换为实例的主机名，或节点的主机名或 IP 地址。 有关详细信息，请参阅“[访问管理 shell (SSH)](/zh/enterprise-server@3.22/admin/administering-your-instance/administering-your-instance-from-the-command-line/accessing-the-administrative-shell-ssh)”。

   ```shell copy
   ssh -p 122 admin@HOSTNAME
   ```

2. 要准备需要导出的存储库，请使用 `ghe-migrator add` 命令和存储库的 URL：
   * 如果要锁定存储库，请在命令后附加 `--lock`。 如果要执行试用运行，则不需要 `--lock`。

     ```shell
     ghe-migrator add https://HOSTNAME/USERNAME/REPO-NAME --lock
     ```

   * 可以通过将 `--exclude_attachments` 附加到命令来排除文件附件。 文件附件可能很大，可能不必要地胀大您的最终迁移存档。

   * 要一次准备多个将导出的存储库，请创建一个文本文件并在单独的行中列出每个存储库 URL，然后运行包含 `ghe-migrator add` 标志和文本文件路径的 `-i` 命令。

     ```shell
     ghe-migrator add -i PATH/TO/YOUR/REPOSITORY_URL.txt
     ```

3. 出现提示时，输入 GitHub Enterprise Server 用户名：

   ```shell
   Enter username authorized for migration:  admin
   ```

4. 出现提示时 personal access token，输入在 [准备 GitHub Enterprise Server 源实例](#preparing-the-github-enterprise-server-source-instance)中创建的访问令牌：

   ```shell
   Enter personal access token:  **************
   ```

5. 在 `ghe-migrator add` 完成后，它将打印自身生成并用于标识此导出的唯一的“迁移 GUID”以及添加到导出中的资源列表。 你将使用它在后续 `ghe-migrator add` 和 `ghe-migrator export` 步骤中生成的迁移 GUID，来指示 `ghe-migrator` 继续对同一导出进行操作。

   ```shell
   > 101 models added to export
   > Migration GUID: EXAMPLE-MIGRATION-GUID
   > Number of records in this migration:
   > users                        |  5
   > organizations                |  1
   > repositories                 |  1
   > teams                        |  3
   > protected_branches           |  1
   > pull_request_reviews         |  1
   > milestones                   |  1
   > issues                       |  3
   > pull_requests                |  5
   > pull_request_review_comments |  4
   > commit_comments              |  2
   > issue_comments               | 10
   > issue_events                 | 63
   > releases                     |  3
   > attachments                  |  4
   > projects                     |  2
   ```

   每次您添加包含现有迁移 GUID 的新仓库时，它都会更新现有导出。 如果在没有迁移 GUID的情况下再次运行 `ghe-migrator add`，将会启动新的导出并生成新的迁移 GUID。 开始准备要导入的迁移时，不要再次使用在导出过程中生成的迁移 GUID。

6. 若要将更多存储库添加到同一导出，请使用带有 `ghe-migrator add` 标志的 `-g` 命令。 您需要传入新仓库 URL 和第 5 步中的迁移 GUID：

   ```shell
   ghe-migrator add https://HOSTNAME/USERNAME/OTHER-REPO-NAME -g MIGRATION-GUID --lock
   ```

7. 添加完存储库后，请使用包含 `ghe-migrator export` 标志和第 5 步中的迁移 GUID 的 `-g` 命令生成迁移存档：

   ```shell
   $ ghe-migrator export -g MIGRATION-GUID
   > Archive saved to: /data/github/current/tmp/MIGRATION-GUID.tar.gz
   ```

   * 要指定迁移文件的暂存位置，请在命令后附加 `--staging-path=/full/staging/path`。 默认为 `/data/user/tmp`。

8. 关闭以下 GitHub.com连接：

   ```shell
   $ exit
   > logout
   > Connection to HOSTNAME closed.
   ```

9. 使用 [`scp`](https://acloudguru.com/blog/engineering/ssh-and-scp-howto-tips-tricks#scp) 命令将迁移存档复制到计算机。 存档文件将使用迁移 GUID 命名：

   ```shell
   scp -P 122 admin@HOSTNAME:/data/github/current/tmp/MIGRATION-GUID.tar.gz ~/Desktop
   ```

10. 若要准备存档的迁移数据以导入到 GitHub Enterprise Server 实例中，请参阅“[将数据迁移到 GitHub Enterprise Server](/zh/migrations/using-ghe-migrator/migrating-data-to-github-enterprise-server#preparing-the-migrated-data)”。