git submodule

مساحات العمل والمشاريع الكبيرة

تضمين مستودعات أخرى داخل مستودعك


يدمج الأمر 'git submodule' مستودع Git آخر في أحد مجلداتك، مثبّتًا على commit محدّد. لا يسجّل مستودعك إلا أي commit من الوحدة الفرعية يُستخدم؛ وتحتفظ الوحدة الفرعية بسجلها الخاص. هكذا تضمّن المشاريع مكتبات مشتركة لا تريد نسخها. يحتاج الاستنساخ إلى --recurse-submodules (أو git submodule update --init) لجلبها.

الصيغة

git submodule add <url> [<path>]
git submodule update --init --recursive
git submodule status
git submodule foreach <command>
[ ] اختياري| أو<arg> قيمة تُستبدل... قابل للتكرار--flag خيار

أمثلة

إضافة مكتبة

git submodule add https://github.com/acme/ui.git lib/ui

يستنسخها ويسجّل commit‏ها.


بعد الاستنساخ

git submodule update --init --recursive

جلب كل وحدة فرعية.


الاستنساخ معها

git clone --recurse-submodules <url>

كل شيء في خطوة واحدة.


التحديث إلى الأحدث

git submodule update --remote

نقل كل وحدة فرعية إلى أحدث commit في فرعها.

أمثلة على سير العمل

1
cd lib/ui && git pull

تقديم الوحدة الفرعية

2
cd ../.. && git add lib/ui

تسجيل الـ commit الجديد

3
git commit -m "Update ui library"

سجّله

حل المشكلات

مجلد وحدة فرعية فارغ

السبب: لم تُجلب الوحدات الفرعية

git submodule update --init --recursive

نصائح وأخطاء شائعة

أفضل الممارسات

  • ✓اضبط git config --global submodule.recurse true كي يحدّث pull وcheckout الوحدات الفرعية.

أخطاء متكررة

  • ✗الاستنساخ دون --recurse-submodules والحصول على مجلدات فارغة.
  • ✗التسجيل داخل وحدة فرعية على HEAD منفصل وضياع العمل.
  • ✗نسيان تسجيل commit الوحدة الفرعية الجديد في المستودع الأب.

الأسئلة الشائعة

A:

عنوان الوحدة الفرعية فقط (في .gitmodules) والـ commit المحدّد الذي تستخدمه.