
# Git

Rudel provádí operace PHP nativní pro Git prostřednictvím Pitmaster. Nevyžaduje binární soubor `git` hostitele. Ke vzdáleným repozitářům se přistupuje přes HTTP(S) nebo SSH.

Každý sandbox má jeden název větve `rudel/{sandbox-id}`, který používají všechny níže uvedené pracovní postupy Git.

## Naklonování vzdáleného repozitáře do nového sandboxu

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

Rudel vytvoří sandbox, naklonuje vzdálený repozitář do `themes/my-theme` uvnitř adresáře sandboxu (název adresáře odpovídá názvu repozitáře), vytvoří větev `rudel/{id}` odvozenou od výchozí větve a přepne na ni. S volbou `--type=plugin` se checkout umístí do `plugins/my-theme`. Vzdálený repozitář, adresář a základní větev se uloží do sandboxu pro pozdější odesílání změn. Pokud klonování selže, sandbox zůstane zachován a příkaz zobrazí varování.

Checkout slouží jako pracovní kopie pro `wp rudel push`. V aktuálním vydání jej sandbox nezpřístupňuje ([issue #11](https://github.com/inline0/rudel/issues/11)):

- Sandbox zpřístupňuje motiv zvolený pomocí `--theme`, případně aktivní motiv hostitele, zkopírovaný z hostitele při vytvoření sandboxu. `--theme` musí označovat motiv nainstalovaný na hostiteli, takže checkout se použije jen tehdy, když název repozitáře odpovídá danému slug a klonování zapíše soubory do zkopírovaného adresáře motivu.
- Pluginy se vždy načítají z adresáře pluginů hostitele, takže checkout `--type=plugin` se nikdy nespustí.

## Propojené pracovní stromy

Když klonujete sandbox, jehož adresář motivu je repozitářem Git, Rudel vytvoří pro nový sandbox propojený pracovní strom namísto kopírování souborů:

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

Pracovní strom je na větvi `rudel/{new-id}`. Rudel ho zaznamená do metadat nového sandboxu pod výslovným názvem pracovního stromu odvozeným od ID sandboxu, typu obsahu a slugu motivu, aby se dva sandboxy se stejným slugem motivu nedostaly do konfliktu. Při zničení sandboxu se pracovní strom odstraní a jeho větev smaže.

`wp rudel cleanup --merged` zohledňuje pouze tyto propojené pracovní stromy. Viz [Úklid](https://rudel.inline0.dev/cs/docs/features/cleanup).

## Odeslání změn

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

`push` potvrdí všechny změny v checkoutu a odešle větev `rudel/{id}` do `origin`. Pokud se nic nezměnilo, vrátí `No changes to push.`.

- `--git=<remote>` nastaví vzdálený repozitář, pokud ještě není uložen; po prvním úspěšném odeslání se zapamatuje.
- `--dir=<dir>` vybere adresář relativně k adresáři sandboxu, například `themes/my-theme`. Výchozí je adresář uložený příkazem `--git`, případně celý adresář sandboxu.
- `--message` má výchozí hodnotu `Update from Rudel sandbox`.

Z PHP provede `Rudel::push( $id, $remote_url, $message, $subdir )` totéž a spustí háčky `rudel_*_environment_push`.

## Identita potvrzení změn

Pokud checkout v konfiguraci Git neobsahuje `user.name` ani `user.email`, Rudel zapíše hodnoty `Rudel` a `rudel@localhost`. Chcete-li použít jiné hodnoty, definujte v `wp-config.php` položky `RUDEL_GIT_AUTHOR_NAME` a `RUDEL_GIT_AUTHOR_EMAIL`.
