
# Git

Rudel utilise les opérations Git natives de PHP via Pitmaster. Le binaire hôte `git` n’est pas requis. Les accès distants passent par HTTP(S) ou SSH.

Chaque sandbox a un seul nom de branche, `rudel/{sandbox-id}`, utilisé par tous les workflows Git ci-dessous.

## Cloner un dépôt distant dans une nouvelle sandbox

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

Rudel crée la sandbox, clone le dépôt distant dans `themes/my-theme` au sein du répertoire de la sandbox (le nom du répertoire est celui du dépôt), crée la branche `rudel/{id}` à partir de la branche par défaut et l’active. Avec `--type=plugin`, le dépôt est plutôt cloné dans `plugins/my-theme`. Le dépôt distant, le répertoire et la branche de base sont enregistrés dans la sandbox pour les prochains envois. Si le clonage échoue, la sandbox est conservée et la commande affiche un avertissement.

La copie de travail sert à `wp rudel push`. Dans la version actuelle, la sandbox ne la sert pas ([issue #11](https://github.com/inline0/rudel/issues/11)) :

- La sandbox sert le thème choisi avec `--theme`, ou le thème actif de l’hôte, copié depuis celui-ci lors de la création de la sandbox. `--theme` doit désigner un thème installé sur l’hôte : une copie de travail n’est servie que si le nom du dépôt correspond à cet identifiant et que le clonage écrit ensuite dans le répertoire du thème copié.
- Les extensions sont toujours chargées depuis le répertoire des extensions de l’hôte ; une copie de travail `--type=plugin` ne s’exécute donc jamais.

## Worktrees associés

Lorsque vous clonez une sandbox dont le répertoire de thème est un dépôt Git, Rudel crée un worktree associé pour la nouvelle sandbox au lieu de copier les fichiers :

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

Le worktree utilise la branche `rudel/{new-id}`. Rudel l’enregistre dans les métadonnées de la nouvelle sandbox sous un nom explicite basé sur l’ID de la sandbox, le type de contenu et l’identifiant du thème, afin que deux sandboxes utilisant le même identifiant de thème n’entrent pas en conflit. La destruction de la sandbox supprime le worktree et sa branche.

`wp rudel cleanup --merged` ne prend en compte que ces worktrees associés. Consultez [Nettoyage](https://rudel.inline0.dev/fr/docs/features/cleanup).

## Envoyer les modifications

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

`push` valide toutes les modifications de la copie de travail et envoie la branche `rudel/{id}` vers `origin`. La commande renvoie `No changes to push.` si rien n’a changé.

- `--git=<remote>` définit le dépôt distant s’il n’y en a pas d’enregistré ; après le premier envoi réussi, il est mémorisé.
- `--dir=<dir>` choisit le répertoire relatif au répertoire de la sandbox, par exemple `themes/my-theme`. Par défaut, il s’agit du répertoire enregistré par `--git`, ou de tout le répertoire de la sandbox.
- `--message` vaut par défaut `Update from Rudel sandbox`.

Depuis PHP, `Rudel::push( $id, $remote_url, $message, $subdir )` fait de même et déclenche les hooks `rudel_*_environment_push`.

## Identité de validation

Si la copie de travail ne contient ni `user.name` ni `user.email` dans sa configuration Git, Rudel définit `Rudel` et `rudel@localhost`. Définissez `RUDEL_GIT_AUTHOR_NAME` et `RUDEL_GIT_AUTHOR_EMAIL` dans `wp-config.php` pour utiliser d’autres valeurs.
