
# Git

Το Rudel χρησιμοποιεί λειτουργίες Git εγγενείς στο PHP μέσω του Pitmaster. Δεν απαιτεί το δυαδικό αρχείο `git` του host. Η πρόσβαση στα απομακρυσμένα αποθετήρια γίνεται μέσω HTTP(S) ή SSH.

Κάθε sandbox έχει ένα όνομα κλάδου, το `rudel/{sandbox-id}`, που χρησιμοποιείται από όλες τις παρακάτω ροές εργασίας Git.

## Κλωνοποίηση απομακρυσμένου αποθετηρίου σε νέο sandbox

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

Το Rudel δημιουργεί το sandbox, κλωνοποιεί το απομακρυσμένο αποθετήριο στο `themes/my-theme` μέσα στον κατάλογο του sandbox (το όνομα του καταλόγου είναι το όνομα του αποθετηρίου), δημιουργεί τον κλάδο `rudel/{id}` από τον προεπιλεγμένο κλάδο και τον επιλέγει. Με το `--type=plugin`, η επιλογή γίνεται στο `plugins/my-theme`. Το απομακρυσμένο αποθετήριο, ο κατάλογος και ο βασικός κλάδος αποθηκεύονται στο sandbox για μελλοντικές αποστολές αλλαγών. Αν αποτύχει η κλωνοποίηση, το sandbox διατηρείται και η εντολή εμφανίζει προειδοποίηση.

Το checkout είναι ένα λειτουργικό αντίγραφο για το `wp rudel push`. Στην τρέχουσα έκδοση, το sandbox δεν το προβάλλει ([issue #11](https://github.com/inline0/rudel/issues/11)):

- Το sandbox προβάλλει το θέμα που επιλέχθηκε με το `--theme` ή το ενεργό θέμα του host, το οποίο αντιγράφεται από τον host κατά τη δημιουργία του sandbox. Το `--theme` πρέπει να δηλώνει ένα θέμα εγκατεστημένο στον host. Έτσι, ένα checkout προβάλλεται μόνο όταν το όνομα του αποθετηρίου ταιριάζει με αυτό το slug και η κλωνοποίηση γράφει στον αντιγραμμένο κατάλογο του θέματος.
- Τα πρόσθετα φορτώνονται πάντα από τον κατάλογο πρόσθετων του host, επομένως ένα checkout `--type=plugin` δεν εκτελείται ποτέ.

## Συνδεδεμένα worktrees

Όταν κλωνοποιείτε ένα sandbox του οποίου ο θεματικός κατάλογος είναι αποθετήριο Git, το Rudel δημιουργεί ένα συνδεδεμένο worktree για το νέο sandbox αντί να αντιγράφει αρχεία:

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

Το worktree βρίσκεται στον κλάδο `rudel/{new-id}`. Το Rudel το καταγράφει στα μεταδεδομένα του νέου sandbox με ρητό όνομα worktree που βασίζεται στο ID του sandbox, τον τύπο περιεχομένου και το slug του θέματος, ώστε να μην υπάρχει σύγκρουση μεταξύ δύο sandbox που χρησιμοποιούν το ίδιο slug θέματος. Η καταστροφή του sandbox αφαιρεί το worktree και διαγράφει τον κλάδο του.

Το `wp rudel cleanup --merged` λαμβάνει υπόψη μόνο αυτά τα συνδεδεμένα worktrees. Δείτε την ενότητα [Εκκαθάριση](https://rudel.inline0.dev/el/docs/features/cleanup).

## Αποστολή αλλαγών

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

Το `push` κάνει commit κάθε αλλαγή στο checkout και στέλνει τον κλάδο `rudel/{id}` στο `origin`. Επιστρέφει `No changes to push.` όταν δεν υπάρχουν αλλαγές.

- Το `--git=<remote>` ορίζει το απομακρυσμένο αποθετήριο, αν δεν έχει αποθηκευτεί κανένα· μετά την πρώτη επιτυχημένη αποστολή, το απομνημονεύει.
- Το `--dir=<dir>` επιλέγει τον κατάλογο σε σχέση με τον κατάλογο του sandbox, για παράδειγμα `themes/my-theme`. Έχει προεπιλογή τον κατάλογο που αποθηκεύτηκε από το `--git` ή, διαφορετικά, ολόκληρο τον κατάλογο του sandbox.
- Το `--message` έχει προεπιλογή το `Update from Rudel sandbox`.

Από το PHP, το `Rudel::push( $id, $remote_url, $message, $subdir )` κάνει το ίδιο και ενεργοποιεί τα hooks `rudel_*_environment_push`.

## Ταυτότητα commit

Αν το checkout δεν έχει `user.name` ή `user.email` στη διαμόρφωση Git του, το Rudel γράφει τα `Rudel` και `rudel@localhost`. Ορίστε τα `RUDEL_GIT_AUTHOR_NAME` και `RUDEL_GIT_AUTHOR_EMAIL` στο `wp-config.php` για να χρησιμοποιήσετε άλλες τιμές.
