Git School · FluxGit

Git worktree أم submodule؟ اختر بحسب ملكية التاريخ

FluxGit ·

تمثل المقاطع حالات مختلفة وليست سكربتاً واحداً. اختر الحالة المناسبة لمستودعك واستبدل أسماء الفروع والمسارات وVERIFIED_COMMIT قبل الاستخدام. أوامر الإلغاء تخص العملية النشطة المقابلة فقط؛ لا تنفذ البديلين معاً.

الجواب المختصر

استخدم worktree لنسخة عمل أخرى من المستودع نفسه في مهام متوازية أو مراجعة فرع. استخدم submodule عندما يجب أن يسجل الأب commit معينة من مستودع آخر كتبعية. الأول مجلد عمل لتاريخ مشترك، والثاني مستودع مستقل الإصدار يسجل الأب اختياره.

القرارWorktreeSubmodule
التاريخالمستودع نفسه؛ كائنات ومراجع مشتركةمستودع ابن مستقل؛ الأب يسجل 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 المعنية. احتفظ بفحوص الفرع والمشاركة والملفات المحلية في هذا المثال. تعرض صفحة التنزيل النسخ والمنصات المتاحة حالياً.

مراجع Git الرسمية

مسارات ذات صلة

تنزيل FluxGit