Git worktree أم submodule؟ اختر بحسب ملكية التاريخ
تمثل المقاطع حالات مختلفة وليست سكربتاً واحداً. اختر الحالة المناسبة لمستودعك واستبدل أسماء الفروع والمسارات وVERIFIED_COMMIT قبل الاستخدام. أوامر الإلغاء تخص العملية النشطة المقابلة فقط؛ لا تنفذ البديلين معاً.
الجواب المختصر
استخدم worktree لنسخة عمل أخرى من المستودع نفسه في مهام متوازية أو مراجعة فرع. استخدم submodule عندما يجب أن يسجل الأب commit معينة من مستودع آخر كتبعية. الأول مجلد عمل لتاريخ مشترك، والثاني مستودع مستقل الإصدار يسجل الأب اختياره.
| القرار | Worktree | Submodule |
|---|---|---|
| التاريخ | المستودع نفسه؛ كائنات ومراجع مشتركة | مستودع ابن مستقل؛ الأب يسجل commit محدداً |
| الملفات | HEAD وفهرس ومجلد عمل مستقلون | قد تختلف نسخة الابن ونسختا الأب والفهرس المثبتتان |
| الإصدار | فرع أو commit من المستودع نفسه | commit ابن مختار وليس .gitmodules وحده |
| التحديث | مراجعة الفرع المختار ودمجه | نسخة عند commit المسجل؛ --remote اختيار آخر |
| الحد | عادة نسخة واحدة لكل فرع؛ ليس عزلاً للصلاحيات | دعم غير مكتمل في عدة worktrees؛ عمل الابن منفصل |
المثال وشروطه
حدد أولاً من يملك التاريخ. وكيلان يجربان إصلاحين لتطبيق واحد يحتاجان عادة فروعاً وأشجار عمل منفصلة. مكتبة ذات إصدارات خاصة قد تحتاج تبعية مثبتة. ليس أي منهما عزلاً للصلاحيات؛ التحكم في وصول الملفات والوكلاء يبقى مستقلاً.
افحص الحالة قبل التعديل
للـworktree المرتبط HEAD وفهرس وملفات خاصة، مع كائنات ومعظم مراجع مشتركة. يسمح بمراجعة فرع آخر دون استبدال عملك الحالي. يمنع Git عادة فتح الفرع نفسه في نسختي worktree معاً. مشاركة الكائنات لا تنقل التعديلات غير المجهزة تلقائياً إلى المجلد الآخر.
git status --short
git branch --show-current
git worktree listاحتفظ بمرجع أو نسخة عمل منفصلة
افحص الحالة وأنشئ review/worktree في ../topic-review. استخدم git -C لفحص النسخة ومقارنة commits قبل تكامل النتيجة المختارة. فصل المجلدات يقلل خلط المهام لكنه لا يجعل التغييرات متوافقة. افحص التكامل وتجنب أداتين تعدلان النسخة نفسها بالتزامن.
git worktree add -b review/worktree ../topic-review HEAD
git -C ../topic-review status --short
git -C ../topic-review branch --show-currentالمسار الأول
Submodule مستودع منفصل داخل مسار في الأب. تسجل شجرة الأب المؤكدة gitlink، عادة بالنمط 160000، إلى commit ابن. قد يجهز الفهرس commit أخرى ويختلف HEAD الابن عن الاثنين. تصف .gitmodules المسار والرابط؛ الإصدار المختار يأتي من commit المسجلة.
اختر النتيجة الأخرى عن قصد
في deps/library افحص submodule status وgitlink الخاص بـHEAD الأب وgitlink المجهز وHEAD الابن منفصلة. قد يغير pull الأب القيمة المثبتة دون تحريك نسخة الابن. يستخدم submodule update الاختيار المسجل؛ يتبع --remote اختياراً بعيداً عن قصد، وهو قرار إصدار آخر لا مجرد تنظيف الحالة.
git submodule status -- deps/library
git ls-tree HEAD -- deps/library
git ls-files --stage -- deps/library
git -C deps/library rev-parse HEAD
git --no-optional-locks -C deps/library status --shortالحدود والاستثناءات
يوثق Git دعماً غير مكتمل لـsubmodules في عدة worktrees. لا يجعل --recursive أي تركيب بيئة معزولة مدعومة. افحص القيود ومسار checkout والتحديث الحقيقي، وفكر في clone منفصل إذا احتجت حالة مستقلة. ليست المقارنة وصفة عامة لأتمتة الجمع بينهما.
التعارضات والتنظيف
قبل إزالة worktree افحص الملفات المحلية والفرع، واستخدم worktree remove بدلاً من حذف المجلد عشوائياً. احفظ الفرع المطلوب أو الدمج المراجع. قبل تغيير التبعية، احفظ وانشر تعديل الابن عبر مساره ليحصل عليه clone آخر، ثم سجل الاختيار في الأب.
git -C ../topic-review status --short
git worktree remove ../topic-review
git worktree listتحقق من النتيجة
في worktree تحقق من الفرع والحالة والتكامل المختار. في submodule قارن الحالات الثلاث وتأكد أن الجمهور المقصود يستطيع جلب كائن الابن. نظافة الأب لا تضمن نظافة كل أبناءه. لا يحتفظ أيهما بنسخة دائمة لملفات غير مؤكدة؛ يتبع الفحص علاقة التاريخين.
git worktree list
git submodule status -- deps/libraryأسئلة شائعة
لماذا worktree؟ فرع آخر دون استبدال النسخة الحالية. متى submodule؟ تبعية مستقلة الإصدارات مثبتة في الأب. لماذا تجنبهما؟ قواعد التحديث المنفصلة تكلف تنسيقاً. مدير حزم أو vendoring أو subtree أو clone مستقل بدائل بحسب ملكية الإصدارات والتسليم، لا فائز شامل.
راجع العملية في FluxGit
استخدم عرض التاريخ والتغييرات في FluxGit لمراجعة العملية وcommits المعنية. احتفظ بفحوص الفرع والمشاركة والملفات المحلية في هذا المثال. تعرض صفحة التنزيل النسخ والمنصات المتاحة حالياً.