
# Git

Rudel gebruikt PHP-native Git-bewerkingen via Pitmaster. De `git`-binary op de host is niet nodig. Remotes zijn bereikbaar via HTTP(S) of SSH.

Elke sandbox heeft één branchnaam, `rudel/{sandbox-id}`, die in elke onderstaande Git-workflow wordt gebruikt.

## Een remote naar een nieuwe sandbox klonen

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

Rudel maakt de sandbox aan, kloont de remote naar `themes/my-theme` in de sandboxmap (de mapnaam is de repositorynaam), maakt branch `rudel/{id}` aan op basis van de standaardbranch en schakelt daarnaar over. Met `--type=plugin` wordt de checkout in plaats daarvan naar `plugins/my-theme` geplaatst. De remote, map en basisbranch worden op de sandbox opgeslagen voor latere pushes. Als het klonen mislukt, blijft de sandbox bestaan en geeft de opdracht een waarschuwing weer.

De checkout is een werkkopie voor `wp rudel push`. In de huidige release serveert de sandbox deze niet ([issue #11](https://github.com/inline0/rudel/issues/11)):

- De sandbox serveert het thema dat is gekozen met `--theme`, of het actieve thema van de host, dat bij het aanmaken van de sandbox vanaf de host is gekopieerd. `--theme` moet verwijzen naar een thema dat op de host is geïnstalleerd. Een checkout wordt dus alleen geserveerd als de repositorynaam overeenkomt met die slug en de kloon vervolgens naar de gekopieerde themamap schrijft.
- Plugins worden altijd geladen vanuit de pluginmap van de host, dus een checkout van `--type=plugin` wordt nooit uitgevoerd.

## Gekoppelde worktrees

Als u een sandbox kloont waarvan de themamap een Git-repository is, maakt Rudel een gekoppelde worktree voor de nieuwe sandbox aan in plaats van bestanden te kopiëren:

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

De worktree staat op branch `rudel/{new-id}`. Rudel registreert deze in de metadata van de nieuwe sandbox onder een expliciete worktreenaam op basis van de sandbox-ID, het inhoudstype en de themaslug, zodat twee sandboxes met dezelfde themaslug elkaar niet in de weg zitten. Als u de sandbox vernietigt, wordt de worktree verwijderd en de branch gewist.

`wp rudel cleanup --merged` houdt alleen rekening met deze gekoppelde worktrees. Zie [Opschoning](https://rudel.inline0.dev/nl/docs/features/cleanup).

## Wijzigingen pushen

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

`push` commit elke wijziging in de checkout en pusht branch `rudel/{id}` naar `origin`. De opdracht geeft `No changes to push.` terug als er niets is gewijzigd.

- `--git=<remote>` stelt de remote in als er nog geen is opgeslagen; na de eerste geslaagde push wordt deze onthouden.
- `--dir=<dir>` bepaalt de map relatief ten opzichte van de sandboxmap, bijvoorbeeld `themes/my-theme`. De standaard is de map die door `--git` is opgeslagen, of anders de volledige sandboxmap.
- `--message` is standaard ingesteld op `Update from Rudel sandbox`.

Vanuit PHP doet `Rudel::push( $id, $remote_url, $message, $subdir )` hetzelfde en activeert het de hooks `rudel_*_environment_push`.

## Commitidentiteit

Als de checkout geen `user.name` of `user.email` in de Git-configuratie heeft, schrijft Rudel `Rudel` en `rudel@localhost` weg. Definieer `RUDEL_GIT_AUTHOR_NAME` en `RUDEL_GIT_AUTHOR_EMAIL` in `wp-config.php` om andere waarden te gebruiken.
