> ## Documentation Index
> Fetch the complete documentation index at: https://docs.diversion.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# サブモジュール

> 別のリポジトリをコミットにピン留めして、自リポジトリの内部にマウントする

サブモジュールは、あるDiversionリポジトリを別のリポジトリ内のフォルダーパスにマウントし、
特定のコミットにピン留めする機能です。エンジン、ライブラリ、アートパックなどをプロジェクト間で共有する用途に使用します。各プロジェクトは使用するバージョンを個別に決定でき、アップグレードは明示的でレビュー可能な変更となります。

## 主要な用語

* **マウントパス** — 親リポジトリ内で他のリポジトリが現れるフォルダー。例: `libs/engine`。
* **ピン** — 親リポジトリが指し示すマウント先リポジトリのコミット。ピンは親の履歴の一部であるため、親を同期する全員が同じバージョンを取得します。
* **子ワークスペース** — マウントパス内にDiversionが作成する、マウントされたリポジトリの作業コピー。実際のワークスペースであり、ブランチのチェックアウト、編集、コミットが可能です。

## サブモジュールを追加する

親ワークスペース内の任意の場所から実行します。

```bash theme={null}
dv submodule add <repo> libs/engine                 # リポジトリのデフォルトブランチの先端にピン留め
dv submodule add <repo> libs/engine --ref <commit>  # 特定のコミットにピン留め
```

`<repo>` はマウント先リポジトリの名前またはIDです。ファイルは `libs/engine` に配置され、ピンは親にコミットされるため、チームメンバーは親を同期するとサブモジュールを取得できます。

Diversionは、既にファイルが存在するフォルダー、シンボリックリンク、または既存のマウントと大文字小文字のみが異なるパス (Windows および macOS では同じフォルダーを開くパス) へのマウントを拒否します。

## サブモジュールの状態を確認する

```bash theme={null}
dv submodule status
```

```
PATH         REPO    PINNED COMMIT   STATE         LOCAL CHANGES
libs/engine  engine  dv.commit.42    synced        0
libs/tools   tools   dv.commit.7     pin_mismatch  2
```

* `synced` — ローカルのマウントがピン留めされたコミットにあります。
* `missing` — ポインターは存在しますが、ローカルにファイルがまだ作成されていません (例: 親のクローン直後)。`dv submodule update` を実行してください。
* `pin_mismatch` — ローカルのマウントがピンとは異なるコミットにあります。通常はマウント内でコミットした後に発生します。

`LOCAL CHANGES` は子ワークスペース内の未コミット変更の数をカウントします。子ワークスペースの同期が一時停止されている場合は `paused` と表示されます。一時停止されたワークスペースは変更を報告できないためです。

親の通常の `dv status` も、サブモジュールに対応が必要な場合に警告を表示します。

```
Submodules with pending work:
	 libs/engine (engine): not on its pinned commit, 1 uncommitted change
```

## ファイルを取得または修復する

```bash theme={null}
dv submodule update
```

`update` はローカルのマウントをピンに一致させます。欠落しているマウントをクローンし、ずれたマウントをピン留めされたコミットに戻し、削除されたマウントフォルダーを再作成します。未コミットの作業があるマウントやブランチ上のマウントには決して触れません。作業は保護されます。

## サブモジュール内で作業してピンを移動する

マウントは動作するクローンです。マウントされたリポジトリを変更し、親をその結果に向けるには次のようにします。

```bash theme={null}
cd libs/engine
dv checkout main            # 子は detached の状態で始まる。コミットにはブランチが必要
# ファイルを編集
dv commit -a -m "my change"
cd ../..
dv submodule repin libs/engine
```

`repin` は既存のサブモジュールのピンを移動します。`--ref` を指定しない場合、子ワークスペースの現在のコミット (直前にビルドしてテストしたもの) にピン留めします。異なるコミットにピン留めするには次のようにします。

```bash theme={null}
dv submodule repin libs/engine --ref <commit>
```

ピンの移動は決して作業を上書きしません。マウントに未コミットの変更がある場合、コミットするか変更を破棄するまで repin は拒否されます。

## サブモジュールを削除する

```bash theme={null}
dv submodule rm libs/engine
```

ポインターとローカルファイルを削除します。`update` と同様に、マウントに未コミットの作業が残っている間は拒否されます。

## 知っておくとよいこと

* マウント内で実行されたコマンドは、親ではなくマウントされたリポジトリに適用されます。`libs/engine` 内での `dv status` は子の変更を表示します。
* マウント内での編集は親の変更として表示されることはなく、親リポジトリはクリーンなままです。
* 子ワークスペースはワークスペース一覧で `<folder> submodule @ <your machine>` という名前になるため、通常のクローンと簡単に区別できます。
* Webアプリでは、親のファイルツリーがマウントをツリーアイコン付きで表示し、ツールチップにマウントされたリポジトリとそのピン留めされたコミットが表示されます。
* ピンは親の履歴の一部です。親でのブランチ、マージ、および過去への遡行は、他のあらゆる変更と同様にピンを伴います。
