الأشجار الفرعية
الشجرة الفرعية تنسخ مستودعًا آخر داخل دليل من مستودعك. وبعد ذلك تكون الملفات
موجودة حقًا: فـ git clone عادي يجلبها، وgit checkout يحركها كأي ملف آخر،
ولا يحتاج أحد إلى معرفة أن الدليل جاء من مكان آخر.
وهذا هو الفرق كله عن الوحدة الفرعية، التي لا تخزّن سوى مؤشر
وتحتاج إلى --recurse-submodules وإلى سحبها الخاص وإلى HEAD منفصل خاص بها كي
تبقى الأمور مضبوطة.
⌘K ← الأشجار الفرعية.

المأزق الذي لا يذكره أحد
لا يسجّل git أي بيان بالأشجار الفرعية. فالوحدة الفرعية لها .gitmodules،
يسرد كل عنوان وكل مسار. أما الشجرة الفرعية فليس لها شيء — سوى ذيل
git-subtree-dir: على الالتزام الذي نفّذ الاستيراد.
ولذلك يمكن أن يحتوي مستودع على شجرة فرعية دون أن يعطيك أي وسيلة لمعرفة من أين جاءت. ويفعل Gitcito ما يستطيع:
- تُكتشف القائمة من السجل، بقراءة تلك الذيول. فأي شجرة فرعية أضافها أي شخص، بأي أداة، تظهر هنا.
- المستودع المصدر والمرجع يتذكرهما Gitcito، في إعداد git الخاص بهذا المستودع. والشجرة الفرعية المكتشفة من السجل تبدأ بهذين الحقلين فارغين — املأهما مرة واحدة ويعمل السحب والإرسال من بعدها.
والقيم المحفوظة تعيش تحت gitcito.subtree.* في .git/config، فتبقى مع المستودع
لكنها لا تسافر إلى استنساخ. ونسيان المصدر المحفوظ يمسحها ولا يمسّ شيئًا آخر.
إضافة واحدة
| الحقل | معناه |
|---|---|
| الدليل | حيث تحطّ، مثل vendor/parser. ويجب ألا يكون موجودًا بعد |
| المستودع المصدر | عنوان URL أو مسار على القرص |
| فرع أو وسم | ما الذي يُستورد |
| السحق | إدخالها كالتزام واحد بدل سجلها كله |
اترك السحق مفعّلًا ما لم يكن لديك سبب. فبدونه يتداخل كل التزام من التزامات
المكتبة في سجلك إلى الأبد، ويكفّ git log عن أن يكون عن مشروعك أنت.
التعايش معها
| الإجراء | ما يشغّله |
|---|---|
| سحب | git subtree pull — تحطّ تغييرات المنبع بوصفها دمجًا في دليلك |
| إرسال | git subtree push — تعود تغييراتك المحلية تحت ذلك الدليل إلى المصدر |
| فصل | git subtree split -b <branch> — يستخرج السجل الخاص بالدليل إلى فرع، والملفات في جذره |
الفصل هو الأمر الجدير بالمعرفة: فهو يعيد دليلًا مستورَدًا إلى سجل مستودع قائم بذاته، وهذه هي الطريقة التي تكفّ بها الشجرة الفرعية عن كونها شجرة فرعية.
حدود تستحق أن تُعرف
- الإرسال بطيء. فهو يعيد حساب سجل الدليل من الصفر في كل مرة. وعلى مستودع كبير يعني هذا ثوانيَ إلى دقائق، لا لحظة واحدة، وليس بيد Gitcito إلا الانتظار.
- السحب دمج، ولذلك يمكن أن يتعارض كأي دمج — فتجد نفسك في محلّل التعارضات.
git subtreeنص مساهَم به، لا أمر مدمج في git. وقد يخلو منه تثبيت git مجرَّد؛ ويقول Gitcito ذلك بوضوح بدل أن ينقل إليك "'subtree' is not a git command".- السجل المسحوق لا يمكن فكّ سحقه لاحقًا. فالالتزامات لم تُستورد أصلًا.
- لا يحوّل Gitcito وحدة فرعية إلى شجرة فرعية، ولا العكس.
انظر أيضًا: الدمج وإعادة الأساس · السباكة بواجهة