
# Git

Rudel выполняет операции Git с поддержкой PHP через Pitmaster. Для этого не требуется двоичный файл `git` на хосте. Доступ к удаленным репозиториям осуществляется по HTTP(S) или SSH.

У каждой песочницы есть одно имя ветки, `rudel/{sandbox-id}`, используемое во всех описанных ниже процессах Git.

## Клонирование удаленного репозитория в новую песочницу

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

Rudel создает песочницу, клонирует удаленный репозиторий в `themes/my-theme` внутри каталога песочницы (имя каталога совпадает с именем репозитория), создает ветку `rudel/{id}` от ветки по умолчанию и переключается на нее. С `--type=plugin` рабочая копия помещается в `plugins/my-theme`. Удаленный репозиторий, каталог и базовая ветка сохраняются в данных песочницы для последующих отправок изменений. Если клонирование не удается, песочница остается, а команда выводит предупреждение.

Рабочая копия предназначена для `wp rudel push`. В текущем выпуске песочница ее не предоставляет ([issue #11](https://github.com/inline0/rudel/issues/11)):

- Песочница предоставляет тему, выбранную с помощью `--theme`, либо активную тему хоста, скопированную с хоста при создании песочницы. `--theme` должно указывать на тему, установленную на хосте, поэтому рабочая копия предоставляется только в том случае, если имя репозитория совпадает с этим ярлыком и клонирование записывает файлы в скопированный каталог темы.
- Плагины всегда загружаются из каталога плагинов хоста, поэтому рабочая копия `--type=plugin` никогда не запускается.

## Связанные рабочие копии

При клонировании песочницы, каталог темы которой является репозиторием Git, Rudel создает для новой песочницы связанную рабочую копию вместо копирования файлов:

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

Рабочая копия находится на ветке `rudel/{new-id}`. Rudel записывает ее в метаданные новой песочницы под явным именем рабочей копии, составленным на основе идентификатора песочницы, типа содержимого и ярлыка темы, поэтому песочницы с одинаковым ярлыком темы не конфликтуют. При удалении песочницы рабочая копия удаляется, а ее ветка удаляется.

`wp rudel cleanup --merged` учитывает только эти связанные рабочие копии. См. раздел [Очистка](https://rudel.inline0.dev/ru/docs/features/cleanup).

## Отправка изменений

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

`push` фиксирует все изменения в рабочей копии и отправляет ветку `rudel/{id}` в `origin`. Если изменений нет, команда возвращает `No changes to push.`.

- `--git=<remote>` задает удаленный репозиторий, если он еще не сохранен; после первой успешной отправки он запоминается.
- `--dir=<dir>` выбирает каталог относительно каталога песочницы, например `themes/my-theme`. По умолчанию используется каталог, сохраненный командой `--git`, а если он не задан — весь каталог песочницы.
- По умолчанию `--message` равно `Update from Rudel sandbox`.

Из PHP команда `Rudel::push( $id, $remote_url, $message, $subdir )` выполняет то же самое и запускает хуки `rudel_*_environment_push`.

## Идентификация автора коммита

Если в конфигурации Git рабочей копии не заданы `user.name` или `user.email`, Rudel записывает `Rudel` и `rudel@localhost`. Чтобы использовать другие значения, задайте `RUDEL_GIT_AUTHOR_NAME` и `RUDEL_GIT_AUTHOR_EMAIL` в `wp-config.php`.
