
# Git

Rudel usa operazioni PHP native di Git tramite Pitmaster. Non richiede il binario `git` dell'host. I sistemi remoti sono raggiunti tramite HTTP(S) o SSH.

Ogni sandbox ha un unico nome di branch, `rudel/{sandbox-id}`, usato da tutti i workflow Git descritti di seguito.

## Clonare un repository remoto in una nuova sandbox

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

Rudel crea la sandbox, clona il repository remoto in `themes/my-theme` all'interno della directory della sandbox (il nome della directory è quello del repository), crea il branch `rudel/{id}` dal branch predefinito e lo sposta sul checkout. Con `--type=plugin`, il checkout va invece in `plugins/my-theme`. Il repository remoto, la directory e il branch di base vengono salvati nella sandbox per i push successivi. Se la clonazione non riesce, la sandbox viene mantenuta e il comando mostra un avviso.

Il checkout è una copia di lavoro per `wp rudel push`. Nella versione attuale la sandbox non la serve ([issue #11](https://github.com/inline0/rudel/issues/11)):

- La sandbox serve il tema scelto con `--theme`, oppure il tema attivo dell'host, copiato dall'host al momento della creazione della sandbox. `--theme` deve indicare un tema installato sull'host; il checkout viene quindi servito solo se il nome del repository corrisponde allo slug del tema e la clonazione scrive poi nella directory del tema copiata.
- I plugin vengono sempre caricati dalla directory dei plugin dell'host, quindi un checkout `--type=plugin` non viene mai eseguito.

## Worktree collegati

Quando clonate una sandbox la cui directory del tema è un repository Git, Rudel crea un worktree collegato per la nuova sandbox invece di copiare i file:

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

Il worktree usa il branch `rudel/{new-id}`. Rudel lo registra nei metadati della nuova sandbox con un nome esplicito del worktree basato sull'ID della sandbox, sul tipo di contenuto e sullo slug del tema, così due sandbox che usano lo stesso slug del tema non entrano in conflitto. L'eliminazione della sandbox rimuove il worktree ed elimina il branch.

`wp rudel cleanup --merged` considera solo questi worktree collegati. Consultate [Pulizia](https://rudel.inline0.dev/it/docs/features/cleanup).

## Inviare le modifiche

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

`push` esegue il commit di ogni modifica nel checkout e invia il branch `rudel/{id}` a `origin`. Restituisce `No changes to push.` se non ci sono modifiche.

- `--git=<remote>` imposta il repository remoto se non ne è stato salvato nessuno; dopo il primo push riuscito, viene ricordato.
- `--dir=<dir>` seleziona la directory relativa alla directory della sandbox, ad esempio `themes/my-theme`. Per impostazione predefinita usa la directory salvata da `--git`, altrimenti l'intera directory della sandbox.
- `--message` ha valore predefinito `Update from Rudel sandbox`.

Da PHP, `Rudel::push( $id, $remote_url, $message, $subdir )` esegue la stessa operazione e attiva gli hook `rudel_*_environment_push`.

## Identità del commit

Se la configurazione Git del checkout non contiene `user.name` o `user.email`, Rudel scrive `Rudel` e `rudel@localhost`. Definite `RUDEL_GIT_AUTHOR_NAME` e `RUDEL_GIT_AUTHOR_EMAIL` in `wp-config.php` per usare altri valori.
