
# Git

Rudel usa operaciones Git nativas de PHP mediante Pitmaster. No requiere el binario `git` del host. Se accede a los remotos mediante HTTP(S) o SSH.

Cada entorno aislado tiene un nombre de rama, `rudel/{sandbox-id}`, que usan todos los flujos de trabajo Git siguientes.

## Clonar un remoto en un entorno aislado nuevo

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

Rudel crea el entorno aislado, clona el remoto en `themes/my-theme` dentro del directorio del entorno aislado (el nombre del directorio es el del repositorio), crea la rama `rudel/{id}` a partir de la rama predeterminada y la cambia. Con `--type=plugin`, el cambio se hace a `plugins/my-theme`. El remoto, el directorio y la rama base se guardan en el entorno aislado para futuros envíos. Si falla la clonación, el entorno aislado se conserva y el comando muestra una advertencia.

El cambio crea una copia de trabajo para `wp rudel push`. En la versión actual, el entorno aislado no la sirve ([incidencia #11](https://github.com/inline0/rudel/issues/11)):

- El entorno aislado sirve el tema elegido con `--theme` o el tema activo del host, copiado del host al crear el entorno aislado. `--theme` debe indicar un tema instalado en el host, así que la copia de trabajo solo se sirve si el nombre del repositorio coincide con ese slug y la clonación escribe después en el directorio del tema copiado.
- Los complementos siempre se cargan desde el directorio de complementos del host, por lo que una copia de trabajo `--type=plugin` nunca se ejecuta.

## Áreas de trabajo vinculadas

Al clonar un entorno aislado cuyo directorio del tema es un repositorio Git, Rudel crea un área de trabajo vinculada para el nuevo entorno aislado en lugar de copiar los archivos:

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

El área de trabajo está en la rama `rudel/{new-id}`. Rudel la registra en los metadatos del nuevo entorno aislado con un nombre explícito basado en el ID del entorno aislado, el tipo de contenido y el slug del tema, para que no haya conflictos entre dos entornos aislados que usan el mismo slug de tema. Al destruir el entorno aislado, se elimina el área de trabajo y se borra su rama.

`wp rudel cleanup --merged` solo tiene en cuenta estas áreas de trabajo vinculadas. Consulte [Limpieza](https://rudel.inline0.dev/es/docs/features/cleanup).

## Enviar cambios

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

`push` confirma cada cambio de la copia de trabajo y envía la rama `rudel/{id}` a `origin`. Devuelve `No changes to push.` cuando no hay cambios.

- `--git=<remote>` establece el remoto si no hay ninguno guardado; tras el primer envío correcto, se recuerda.
- `--dir=<dir>` elige el directorio relativo al directorio del entorno aislado, por ejemplo `themes/my-theme`. De forma predeterminada, usa el directorio guardado por `--git` o, si no hay ninguno, todo el directorio del entorno aislado.
- `--message` tiene `Update from Rudel sandbox` como valor predeterminado.

Desde PHP, `Rudel::push( $id, $remote_url, $message, $subdir )` hace lo mismo y ejecuta los hooks de `rudel_*_environment_push`.

## Identidad de confirmación

Si la copia de trabajo no tiene `user.name` ni `user.email` en su configuración Git, Rudel escribe `Rudel` y `rudel@localhost`. Defina `RUDEL_GIT_AUTHOR_NAME` y `RUDEL_GIT_AUTHOR_EMAIL` en `wp-config.php` para usar otros valores.
