
# Git

RudelはPitmasterを通じてPHPネイティブのGit操作を行います。ホストの`git`バイナリは不要です。リモートにはHTTP(S)またはSSHで接続します。

各サンドボックスには`rudel/{sandbox-id}`という1つのブランチ名があり、以下のすべてのGitワークフローで使われます。

## リモートを新しいサンドボックスにクローンする

```bash
wp rudel create --name=feature-x --git=https://example.test/my-theme.git
```

Rudelはサンドボックスを作成し、サンドボックスディレクトリ内の`themes/my-theme`にリモートをクローンします（ディレクトリ名はリポジトリ名です）。既定のブランチからブランチ`rudel/{id}`を作成してチェックアウトします。`--type=plugin`を指定すると、代わりにチェックアウト先は`plugins/my-theme`になります。後でプッシュできるよう、リモート、ディレクトリ、ベースブランチがサンドボックスに保存されます。クローンに失敗してもサンドボックスは残り、コマンドに警告が表示されます。

チェックアウトは`wp rudel push`用の作業コピーです。現行リリースでは、サンドボックスからは配信されません（[issue #11](https://github.com/inline0/rudel/issues/11)）。

- サンドボックスでは、`--theme`で選択したテーマ、またはホストの現在のテーマが使われます。サンドボックス作成時にホストからコピーされます。`--theme`にはホストにインストール済みのテーマを指定する必要があります。そのため、チェックアウトが使われるのはリポジトリ名がそのスラッグと一致し、クローン先がコピー済みのテーマディレクトリである場合に限られます。
- プラグインは常にホストのプラグインディレクトリから読み込まれるため、`--type=plugin`のチェックアウトは実行されません。

## リンクされたワークツリー

テーマディレクトリがGitリポジトリであるサンドボックスをクローンすると、Rudelはファイルをコピーする代わりに、新しいサンドボックス用のリンクされたワークツリーを作成します。

```bash
wp rudel create --name=feature-y --clone-from=feature-x-3be7
```

ワークツリーはブランチ`rudel/{new-id}`上にあります。RudelはサンドボックスID、コンテンツタイプ、テーマスラッグに基づく明示的なワークツリー名で、新しいサンドボックスのメタデータに記録します。同じテーマスラッグを使う2つのサンドボックスが衝突することはありません。サンドボックスを破棄すると、ワークツリーが削除され、ブランチも削除されます。

`wp rudel cleanup --merged`が対象とするのは、これらのリンクされたワークツリーのみです。[クリーンアップ](https://rudel.inline0.dev/ja/docs/features/cleanup)を参照してください。

## 変更をプッシュする

```bash
wp rudel push feature-x-3be7 --message="Update checkout template"
```

`push`はチェックアウト内のすべての変更をコミットし、ブランチ`rudel/{id}`を`origin`にプッシュします。変更がない場合は`No changes to push.`を返します。

- 保存済みのリモートがない場合、`--git=<remote>`がリモートを設定します。最初のプッシュが成功すると、そのリモートが記憶されます。
- `--dir=<dir>`はサンドボックスディレクトリからの相対パスでディレクトリを指定します。例: `themes/my-theme`。デフォルトでは`--git`に保存されたディレクトリが使われ、保存先がない場合はサンドボックスディレクトリ全体が対象になります。
- `--message`のデフォルトは`Update from Rudel sandbox`です。

PHPから実行すると、`Rudel::push( $id, $remote_url, $message, $subdir )`も同じ処理を行い、`rudel_*_environment_push`フックを発火させます。

## コミットの識別情報

チェックアウトのGit設定に`user.name`も`user.email`もない場合、Rudelは`Rudel`と`rudel@localhost`を書き込みます。別の値を使うには、`wp-config.php`で`RUDEL_GIT_AUTHOR_NAME`と`RUDEL_GIT_AUTHOR_EMAIL`を定義してください。
