
# Git

Rudel verwendet PHP-native Git-Operationen über Pitmaster. Die Host-`git`-Binärdatei ist nicht erforderlich. Remotes werden über HTTP(S) oder SSH erreicht.

Jede Sandbox hat einen Branch-Namen, `rudel/{sandbox-id}`, der für alle nachfolgend beschriebenen Git-Abläufe verwendet wird.

## Ein Remote-Repository in eine neue Sandbox klonen

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

Rudel erstellt die Sandbox, klont das Remote-Repository nach `themes/my-theme` im Sandbox-Verzeichnis (das Verzeichnis heißt wie das Repository), erstellt den Branch `rudel/{id}` ausgehend vom Standard-Branch und checkt ihn aus. Mit `--type=plugin` kommt der Checkout stattdessen nach `plugins/my-theme`. Remote, Verzeichnis und Basis-Branch werden für spätere Pushes in der Sandbox gespeichert. Schlägt der Klon fehl, bleibt die Sandbox bestehen und der Befehl gibt eine Warnung aus.

Der Checkout ist eine Arbeitskopie für `wp rudel push`. In der aktuellen Version stellt die Sandbox sie nicht bereit ([Issue #11](https://github.com/inline0/rudel/issues/11)):

- Die Sandbox verwendet das mit `--theme` ausgewählte Theme oder das aktive Theme des Hosts, das beim Erstellen der Sandbox vom Host kopiert wird. `--theme` muss ein auf dem Host installiertes Theme angeben. Ein Checkout wird daher nur verwendet, wenn der Repository-Name mit diesem Slug übereinstimmt und der Klon anschließend in das kopierte Theme-Verzeichnis schreibt.
- Plugins werden immer aus dem Plugin-Verzeichnis des Hosts geladen. Ein Checkout von `--type=plugin` wird daher nie ausgeführt.

## Verknüpfte Worktrees

Wenn du eine Sandbox klonst, deren Theme-Verzeichnis ein Git-Repository ist, erstellt Rudel für die neue Sandbox einen verknüpften Worktree, anstatt Dateien zu kopieren:

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

Der Worktree befindet sich auf dem Branch `rudel/{new-id}`. Rudel speichert ihn in den Metadaten der neuen Sandbox unter einem expliziten Worktree-Namen, der auf Sandbox-ID, Inhaltstyp und Theme-Slug basiert. So kommen sich zwei Sandboxes mit demselben Theme-Slug nicht in die Quere. Beim Löschen der Sandbox wird der Worktree entfernt und sein Branch gelöscht.

`wp rudel cleanup --merged` berücksichtigt nur diese verknüpften Worktrees. Siehe [Bereinigung](https://rudel.inline0.dev/de/docs/features/cleanup).

## Änderungen pushen

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

`push` committet jede Änderung im Checkout und pusht den Branch `rudel/{id}` zu `origin`. Wenn es keine Änderungen gibt, gibt der Befehl `No changes to push.` zurück.

- `--git=<remote>` legt das Remote fest, wenn keines gespeichert ist; nach dem ersten erfolgreichen Push wird es gespeichert.
- `--dir=<dir>` wählt das Verzeichnis relativ zum Sandbox-Verzeichnis aus, zum Beispiel `themes/my-theme`. Standardmäßig wird das von `--git` gespeicherte Verzeichnis verwendet, andernfalls das gesamte Sandbox-Verzeichnis.
- `--message` ist standardmäßig `Update from Rudel sandbox`.

Von PHP aus führt `Rudel::push( $id, $remote_url, $message, $subdir )` dasselbe aus und löst die Hooks `rudel_*_environment_push` aus.

## Commit-Identität

Wenn im Git-Config des Checkouts weder `user.name` noch `user.email` festgelegt ist, schreibt Rudel `Rudel` und `rudel@localhost`. Lege `RUDEL_GIT_AUTHOR_NAME` und `RUDEL_GIT_AUTHOR_EMAIL` in `wp-config.php` fest, um andere Werte zu verwenden.
