# Enterprise Live Migrations を使用したリポジトリの移行

ダウンタイムを最小限に抑えて、 GitHub Enterprise Server から GHE.com に移行します。

> \[!NOTE]
> Enterprise Live Migrations は パブリック プレビュー であり、変更される可能性があります。

> \[!TIP] このガイドに従うと、使用に関する詳細な情報については [、AUTOTITLE](/ja/enterprise-server@3.22/migrations/elm/elm-cli-reference) を参照できます。 エラーが発生した場合は、 [GitHub Enterprise Server から GHE.com へのライブ マイグレーションのトラブルシューティング](/ja/enterprise-server@3.22/migrations/elm/troubleshooting) を参照してください。

## 前提条件

移行の準備ができていることを確認します。 「[GitHub Enterprise Server から GHE.com へのライブ マイグレーションの準備](/ja/enterprise-server@3.22/migrations/elm/prepare-for-your-migration)」を参照してください。

## 1. アクセス トークンを作成する

移行のソースと移行先の両方について、 personal access token (classic) で認証する必要があります。 詳しい手順については、「[個人用アクセス トークンを管理する](/ja/enterprise-server@3.22/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic)」を参照してください。

次の手順で必要になるので、**両方のトークンを書き留めます**。

1. 次のスコープを使用して、personal access token (classic) で GitHub Enterprise Server を作成します。

   * `repo`
   * `admin:org`
   * `admin:repo_hook`
   * `admin:org_hook`

2. 次のスコープを使用して、personal access token (classic) で GHE.com を作成します。

   * `repo`
   * `workflow`
   * `admin:org`
   * `admin:repo_hook`
   * `admin:enterprise`

3. GHE.comでターゲット組織にシングル サインオンが適用されている場合は、GHE.com トークンを承認します。

## 2. 構成 GitHub Enterprise Server

移行を実行する前に、 GitHub Enterprise Server インスタンスで何らかの構成を設定する必要があります。 これらの構成値は、すべての ELM 移行に適用されます。
GitHub Enterprise Serverの開発者は、新しい構成を適用するときに短いダウンタイムが発生する可能性があります。

1. SSH 経由で GitHub Enterprise Server 管理シェルにアクセスします。 「[管理シェル (SSH) にアクセスする](/ja/enterprise-server@3.22/admin/administering-your-instance/administering-your-instance-from-the-command-line/accessing-the-administrative-shell-ssh)」を参照してください。
2. `ghe-config`を使用して、次の構成変数を設定します。

   例えば： `ghe-config app.elm-exporter.enabled true`

   | Variable                                             | これを \[...] に設定します。                                                                    |
   | ---------------------------------------------------- | ------------------------------------------------------------------------------------- |
   | `app.elm-exporter.enabled`                           | `true`                                                                                |
   | `app.elm.internal-webhooks-enabled`                  | `true`                                                                                |
   | `app.elm-exporter.webhooks-loopback-address-enabled` | `true`                                                                                |
   | `secrets.elm-exporter.migration-target-url`          | 移行先企業の API URL (例: `https://api.octocorp.ghe.com`)。 URL の末尾に末尾のスラッシュを含 **めないでください** 。 |
   | `secrets.elm-exporter.migration-target-token`        |                                                                                       |

GHE.com用に作成したアクセス トークン。 |
\| `secrets.elm-exporter.source-token` |
GitHub Enterprise Server用に作成したアクセス トークン。 |
\| `secrets.elm-exporter.source-user` |
GitHub Enterprise Server トークンに関連付けられているユーザー名 (例: `ghe-admin`)。 |
\| `app.migrations.enabled` | インスタンスで移行をまだ有効にしていない場合は、これを `true` に設定する必要があります。 |

1. 構成を適用します。

   ```shell copy
   ghe-config-apply
   ```

## 3. 必要な環境変数を設定する

構成が適用され、移行を開始する前に、必要な環境変数を設定します。 例えば次が挙げられます。

```shell
export API_URL='http://localhost:1738'
```

> \[!IMPORTANT]
> `API_URL`と`MIGRATION_MANAGER_HMAC_KEY`の値を逐語的にコピーします。 その他の変数は、環境に固有です。

| Variable                      | 必須の値                                                                                  |
| ----------------------------- | ------------------------------------------------------------------------------------- |
| API\_URL                      | `http://localhost:1738`                                                               |
| MIGRATION\_MANAGER\_HMAC\_KEY | `$(ghe-config secrets.elm-exporter.elm-exporter-hmac-keys)`                           |
| MIGRATION\_TARGET\_URL        | 移行先企業の API URL (例: `https://api.octocorp.ghe.com`)。 URL の末尾に末尾のスラッシュを含 **めないでください** 。 |
| MIGRATION\_TARGET\_TOKEN      | のpersonal access token (classic)GHE.com                                               |

これらの値は、任意の `elm` コマンドで CLI フラグとして指定することもできます。これは、変数よりも優先されます。 たとえば、 `--api-url http://localhost:1738`と指定します。

## 4. 移行を作成する

ソース リポジトリとターゲット リポジトリの詳細を指定して、新しい移行を作成します。
`--pat-name` は静的な値として `system-pat` に設定する必要があります。 その他の値は、環境に固有のプレースホルダーです。

> \[!NOTE]
> `target-org`は新規でも既存でもかまいません。 ターゲット組織がまだ存在しない場合は、移行中に作成されます。 ただし、移行元組織の設定は移行されません。

```shell copy
elm migration create \
  --source-org EXISTING-GHES-ORG \
  --source-repo EXISTING-GHES-REPO \
  --target-org GHEC-ORG \
  --target-repo NEW-GHEC-REPO \
  --target-api GHEC-API-URL \
  --pat-name system-pat
```

例えば次が挙げられます。

```shell
elm migration create \
  --source-org my-ghes-org \
  --source-repo my-ghes-repo \
  --target-org my-dr-org \
  --target-repo my-dr-repo \
  --target-api $MIGRATION_TARGET_URL \
  --pat-name system-pat
```

省略可能なフラグ:

* `--start`: 移行をすぐに開始する準備ができた場合。
* `--target-visibility`: 移行されたリポジトリは、既定で **内部** 可視性を使用して作成されますが、 `private`を指定できます。

### 移行 ID を保存する

次のような応答が表示されます。

```json
{
  "migrationId": "2b5c9eae-b5da-4306-ab04-2a29cc2b7cb9",
  "expiresAt": "2026-02-11T21:49:33.619162159Z"
}
```

次のコマンドに必要な `migrationId` を変数としてエクスポートします。 例えば次が挙げられます。

```shell
export MIGRATION_ID='2b5c9eae-b5da-4306-ab04-2a29cc2b7cb9'
```

## 5. 移行を開始する

まだ移行を開始していない場合は、先ほど保存した移行 ID を使用して移行を開始します。

```shell copy
elm migration start --migration-id $MIGRATION_ID
```

これにより、バックフィルとライブ更新プロセスが起動します。
ELM は現在、ソース リポジトリからデータを収集し、サポートされている Webhook イベントをリッスンしています。

## 6. 移行を監視する

移行が開始されると、 GHE.comに新しいリポジトリが表示されます。 移行中は、開発者がソース リポジトリで作業を続ける際に、リポジトリにデータの初期読み込みが入力され、更新プログラムが受信されます。

次のコマンドを定期的に実行して、移行の状態を監視します。 ソースとターゲットの状態の内訳と、移行中のライブ データに関する情報が表示されます。

```shell copy
elm migration status --migration-id $MIGRATION_ID
```

応答で最も重要なインジケーターは、 **combinedState** オブジェクトの状態です。 状態が `COMBINED_STATUS_READY_FOR_CUTOVER`に達すると、次の手順に進む準備が整います。 ただし、個々のリソースの移行に失敗した場合は、 `displayMessage` でアラートが表示されます。調査が必要な場合があります。

例えば次が挙げられます。

```json
  "combinedState":  {
    "status":  "COMBINED_STATUS_READY_FOR_CUTOVER",
    "displayMessage":  "Ready for cutover (1 resources failed)",
    "repositories":  [
      {
        "repositoryNwo":  "new-test-org/my-new-repo",
        "phase":  "REPOSITORY_PHASE_READY_FOR_CUTOVER",
        "displayStatus":  "Ready for cutover (1 failed)"
      }
    ],
    "readyForCutover":  true,
    "cutoverBlockers":  []
  },
```

ヒント:

* 複数の移行を実行している場合は、すべての移行の状態を `elm migration list`で確認できます。 このコマンドは、既定で進行中の移行を示しますが、 `--status`でフィルター処理することもできます。
* 注意が必要なエラー状態が発生した場合は、 [GitHub Enterprise Server から GHE.com へのライブ マイグレーションのトラブルシューティング](/ja/enterprise-server@3.22/migrations/elm/troubleshooting#statuses-and-recommended-actions) を参照してください。

## 7. 移行を完了する

カットオーバーに向けて移行準備ができたら、移行を完了できます。 カットオーバー プロセスによってソース リポジトリがアーカイブされ、リポジトリ管理者がアーカイブを解除しない限り **、完全に読み取り専用** になります。

```shell copy
elm migration cutover-to-destination --migration-id $MIGRATION_ID
```

引き続き移行を監視します。 応答の上部に `MIGRATION_STATUS_COMPLETED` の状態が表示されると、移行は完了しますが、 GitHub Enterprise Serverからユーザーにアクセス権を付与するためのフォローアップ タスクがいくつかあります。

## 次のステップ

ユーザーに新しいリポジトリへのアクセス権を付与し、ユーザー アカウントを使用してアクティビティを調整します。 「[GitHub Enterprise Server から GHE.com へのライブ マイグレーションの完了](/ja/enterprise-server@3.22/migrations/elm/complete-your-migration)」を参照してください。