guide

ما الذي يُتجاهل وما الذي يُودع في commit

معايير تجاهل مخرجات البناء والاعتماديات والذاكرات المؤقتة والأسرار، وإيداع ملفات القفل وأمثلة الإعداد وإعدادات المحرر المتفق عليها، مع ملفات .gitignore في المجلدات الفرعية والمجلدات الفارغة ونصائح دمج القوالب.

يُقاس ملف .gitignore الجيد بمعاييره لا بطوله. والمعيار واحد: هل يستطيع من يستنسخ المستودع من الصفر إعادة إنتاج النتيجة نفسها بالشيفرة والإعدادات وحدها؟ ما يمكن إعادة إنتاجه يُتجاهل، وما لا يمكن، أو ما يثبّت النتيجة، يُودع.

ما يُتجاهل

النوعأمثلةالسبب
مخرجات البناءdist/، build/، target/، *.o، *.classيُعاد إنتاجها من الشيفرة
الاعتماديات المثبتةnode_modules/، vendor/ (PHP)، .venv/يُعاد تثبيتها من ملف البيان وملف القفل
الذاكرات المؤقتة والسجلات.cache/، .pytest_cache/، *.log، coverage/تتغير مع كل تشغيل
البيئة المحلية والأسرار.env، *.pem، local.properties، *.tfstateتختلف بحسب الشخص/البيئة أو يجب ألا تتسرب
حالة الأدوات الشخصية.DS_Store، *.swp، .idea/workspace.xmlلا علاقة لها بالمشروع (يُنصح بملف gitignore العام)

ما يُودع

ملفات .gitignore في المجلدات الفرعية

لا يقتصر .gitignore على الجذر. فملف .gitignore في مجلد فرعي يعمل على أساس ذلك المجلد وله الأولوية على الملفات الأعلى. وفي monorepo تحتاج فيه كل حزمة إلى قواعد مختلفة، يكون وضع ملف مستقل في كل مجلد حزمة أسهل قراءة.

repo/
├── .gitignore          # common: .DS_Store, .env, coverage/
├── apps/web/.gitignore # .next/, out/
└── services/api/.gitignore # target/

الإبقاء على المجلدات الفارغة

يتتبع git الملفات فقط ولا يحفظ المجلدات الفارغة. لكي يبقى المجلد موجودًا مع تجاهل محتواه، كمجلد السجلات، ضع فيه ملفًّا علامة ثم أعد تضمينه بالنفي.

/log/*
!/log/.keep

الأسماء مثل .keep أو .gitkeep ليست ميزة رسمية في git بل مجرد عرف، وأي اسم يعمل. وطريقة أخرى هي وضع ملف .gitignore في ذلك المجلد بالمحتوى التالي، فيتجاهل كل شيء عدا نفسه.

*
!.gitignore

عند دمج القوالب

قواعد قصيرة ومحددة

القواعد الواسعة جدًّا مثل *.json تبتلع ملفات الإعداد أيضًا. ضيّق المسار قدر الإمكان (/dist/)، وأنهِ المجلدات بشرطة مائلة لتمييزها عن الملفات التي تحمل الاسم نفسه. وتعليق من سطر واحد فوق القاعدة يشرح سببها يساعد الشخص التالي على تقرير ما إذا كان يمكن حذفها.

المراجع

← السابقلماذا يُتجاهل الملف؟ التصحيح باستخدام git check-ignore