
# Git

Rudel usa operações Git nativas de PHP por meio de Pitmaster. Não exige o binário `git` do host. Os repositórios remotos são acessados por HTTP(S) ou SSH.

Cada ambiente isolado tem um nome de branch, `rudel/{sandbox-id}`, usado por todos os fluxos de trabalho Git abaixo.

## Clonar um repositório remoto em um novo ambiente isolado

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

Rudel cria o ambiente isolado, clona o repositório remoto em `themes/my-theme` dentro do diretório do ambiente (o nome do diretório é o nome do repositório), cria o branch `rudel/{id}` a partir do branch padrão e faz o checkout dele. Com `--type=plugin`, o checkout vai para `plugins/my-theme`. O repositório remoto, o diretório e o branch base são armazenados no ambiente isolado para permitir pushes posteriores. Se a clonagem falhar, o ambiente permanece e o comando exibe um aviso.

O checkout é uma cópia de trabalho para `wp rudel push`. Na versão atual, o ambiente isolado não o serve ([problema #11](https://github.com/inline0/rudel/issues/11)):

- O ambiente isolado serve o tema escolhido com `--theme` ou o tema ativo do host, copiado do host quando o ambiente é criado. `--theme` deve indicar um tema instalado no host, então o checkout só é servido quando o nome do repositório corresponde a esse slug e a clonagem grava no diretório do tema copiado.
- Os plugins sempre são carregados do diretório de plugins do host, então um checkout `--type=plugin` nunca é executado.

## Worktrees vinculados

Ao clonar um ambiente isolado cujo diretório do tema é um repositório Git, Rudel cria um worktree vinculado para o novo ambiente em vez de copiar arquivos:

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

O worktree usa o branch `rudel/{new-id}`. Rudel o registra nos metadados do novo ambiente isolado com um nome explícito de worktree baseado no ID do ambiente, no tipo de conteúdo e no slug do tema, para que dois ambientes que usam o mesmo slug de tema não entrem em conflito. Destruir o ambiente remove o worktree e exclui o branch.

`wp rudel cleanup --merged` considera apenas esses worktrees vinculados. Consulte [Limpeza](https://rudel.inline0.dev/pt/docs/features/cleanup).

## Enviar alterações

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

`push` faz commit de todas as alterações no checkout e envia o branch `rudel/{id}` para `origin`. Retorna `No changes to push.` quando não há alterações.

- `--git=<remote>` define o remoto quando nenhum está armazenado; após o primeiro push bem-sucedido, ele fica salvo.
- `--dir=<dir>` escolhe o diretório relativo ao diretório do ambiente isolado, por exemplo `themes/my-theme`. O padrão é o diretório armazenado por `--git`; caso contrário, usa todo o diretório do ambiente.
- `--message` tem como padrão `Update from Rudel sandbox`.

A partir de PHP, `Rudel::push( $id, $remote_url, $message, $subdir )` faz o mesmo e aciona os hooks `rudel_*_environment_push`.

## Identidade do commit

Se o checkout não tiver `user.name` nem `user.email` na configuração Git, Rudel grava `Rudel` e `rudel@localhost`. Defina `RUDEL_GIT_AUTHOR_NAME` e `RUDEL_GIT_AUTHOR_EMAIL` em `wp-config.php` para usar outros valores.
