
# 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`. في الإصدار الحالي، لا تقدمها البيئة المعزولة ([المسألة #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/ar/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`.

## هوية الالتزام

إذا لم تتضمن نسخة المستودع `user.name` أو `user.email` في إعدادات Git، يكتب Rudel القيمتين `Rudel` و`rudel@localhost`. عرّف `RUDEL_GIT_AUTHOR_NAME` و`RUDEL_GIT_AUTHOR_EMAIL` في `wp-config.php` لاستخدام قيم أخرى.
