
# Git

Rudel menggunakan operasi PHP bawaan Git melalui Pitmaster. Tidak memerlukan biner host `git`. Remote diakses melalui HTTP(S) atau SSH.

Setiap sandbox memiliki satu nama cabang, `rudel/{sandbox-id}`, yang digunakan oleh semua alur kerja Git di bawah ini.

## Kloning remote ke sandbox baru

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

Rudel membuat sandbox, mengkloning remote ke `themes/my-theme` di dalam direktori sandbox (nama direktori adalah nama repositori), membuat cabang `rudel/{id}` dari cabang default, lalu melakukan checkout. Dengan `--type=plugin`, checkout diarahkan ke `plugins/my-theme`. Remote, direktori, dan cabang dasar disimpan di sandbox untuk push berikutnya. Jika kloning gagal, sandbox tetap ada dan perintah menampilkan peringatan.

Checkout ini adalah salinan kerja untuk `wp rudel push`. Pada rilis saat ini, sandbox tidak menyajikannya ([masalah #11](https://github.com/inline0/rudel/issues/11)):

- Sandbox menyajikan tema yang dipilih dengan `--theme`, atau tema aktif host, yang disalin dari host saat sandbox dibuat. `--theme` harus merujuk ke tema yang terpasang di host, jadi checkout hanya disajikan jika nama repositori cocok dengan slug tema tersebut dan kloning kemudian menulis ke direktori tema yang disalin.
- Plugin selalu dimuat dari direktori plugin host, jadi checkout `--type=plugin` tidak pernah dijalankan.

## Worktree tertaut

Saat Anda mengkloning sandbox yang direktori temanya merupakan repositori Git, Rudel membuat worktree tertaut untuk sandbox baru alih-alih menyalin file:

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

Worktree berada di cabang `rudel/{new-id}`. Rudel mencatatnya dalam metadata sandbox baru dengan nama worktree eksplisit berdasarkan ID sandbox, jenis konten, dan slug tema, sehingga dua sandbox yang menggunakan slug tema sama tidak bertabrakan. Menghancurkan sandbox akan menghapus worktree dan cabangnya.

`wp rudel cleanup --merged` hanya mempertimbangkan worktree tertaut ini. Lihat [Pembersihan](https://rudel.inline0.dev/id/docs/features/cleanup).

## Push perubahan

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

`push` melakukan commit atas setiap perubahan di checkout dan mendorong cabang `rudel/{id}` ke `origin`. Perintah ini mengembalikan `No changes to push.` jika tidak ada perubahan.

- `--git=<remote>` menetapkan remote jika belum tersimpan; setelah push pertama berhasil, remote tersebut akan diingat.
- `--dir=<dir>` memilih direktori relatif terhadap direktori sandbox, misalnya `themes/my-theme`. Default-nya adalah direktori yang disimpan oleh `--git`, atau seluruh direktori sandbox jika tidak ada.
- `--message` default-nya adalah `Update from Rudel sandbox`.

Dari PHP, `Rudel::push( $id, $remote_url, $message, $subdir )` melakukan hal yang sama dan menjalankan hook `rudel_*_environment_push`.

## Identitas commit

Jika checkout tidak memiliki `user.name` atau `user.email` di konfigurasi Git, Rudel menulis `Rudel` dan `rudel@localhost`. Tetapkan `RUDEL_GIT_AUTHOR_NAME` dan `RUDEL_GIT_AUTHOR_EMAIL` di `wp-config.php` untuk menggunakan nilai lain.
