ملف .gitignore بالتفصيل: ما الذي لا يدخل Git؟
في درس add و commit تعرّفت على .gitignore سريعاً: ملف تكتب فيه أسماء ما لا تريد حفظه. لكن المشاريع الحقيقية فيها مئات الملفات المؤقتة والمولَّدة والسرية، وكتابتها واحداً واحداً مستحيلة. في هذا الدرس ستتعلم الأنماط (Patterns) التي تتجاهل مجموعات كاملة بسطر واحد، وكيف تتصرف مع أشهر مشكلة: ملف دخل Git قبل أن تتجاهله.
ماذا نتجاهل؟
Section titled “ماذا نتجاهل؟”القاعدة: احفظ في Git ما كتبته بيدك، وتجاهل ما يمكن توليده من جديد أو ما يجب أن يبقى سراً.
| النوع | أمثلة |
|---|---|
| مكتبات تُنزَّل تلقائياً | node_modules/ و vendor/ |
| نواتج البناء | build/ و dist/ |
| ملفات السجلات والمؤقتة | *.log و *.tmp |
| الأسرار والإعدادات المحلية | .env وملفات كلمات المرور |
| ملفات النظام والمحرر | .DS_Store و Thumbs.db و .idea/ |
تخيّل المستودع مثل حقيبة سفر: تضع فيها ما تحتاجه فعلاً، لا كل ما في غرفتك.
التجربة العملية
Section titled “التجربة العملية”في مشروعنا my-site ظهرت ملفات كثيرة أثناء العمل:
git status --short?? .env?? app.log?? build/?? debug.log?? images/?? node_modules/?? notes.txtالعلامة ?? تعني «غير متتبَّع». ننشئ ملف .gitignore في جذر المشروع:
# ملفات السجلات*.log
# مجلدات تتولد تلقائياًnode_modules/build/
# الأسرار.envgit status --short?? .gitignore?? images/?? notes.txtاختفت خمسة عناصر بأربعة أسطر. بقي ما يستحق الحفظ فقط، ومعه .gitignore نفسه، وهو ملف عادي يُحفظ في المستودع ليستفيد منه كل الفريق.
قواعد كتابة الأنماط
Section titled “قواعد كتابة الأنماط”| النمط | ما يتجاهله |
|---|---|
debug.log |
أي ملف بهذا الاسم، في أي مجلد |
*.log |
كل الملفات التي تنتهي بـ .log |
build/ |
مجلد build وكل ما بداخله (الشرطة في الآخر تعني «مجلد») |
/todo.txt |
todo.txt في جذر المشروع فقط |
docs/*.pdf |
ملفات PDF داخل docs مباشرة |
**/temp/ |
أي مجلد اسمه temp على أي عمق |
# نص |
تعليق يتجاهله Git |
النجمة * تعني «أي حروف»، والسطر الفارغ للتنظيم فقط.
الاستثناء بعلامة التعجب
Section titled “الاستثناء بعلامة التعجب”تجاهلنا كل ملفات .log، لكن عندنا ملف important.log نريد حفظه. علامة ! في أول السطر تعني «إلا هذا»:
*.log
# استثناء: هذا الملف مهم!important.loggit status --short?? .gitignore?? images/?? important.log?? notes.txtعاد important.log للظهور. والترتيب مهم: الاستثناء يجب أن يأتي بعد القاعدة التي يستثني منها.
لماذا تجاهل Git هذا الملف؟
Section titled “لماذا تجاهل Git هذا الملف؟”في المشاريع الكبيرة قد تتفاجأ بملف لا يظهر في git status. الأمر git check-ignore -v يخبرك أي سطر هو السبب:
git check-ignore -v debug.log.gitignore:2:*.log debug.logالملف .gitignore، السطر 2، النمط *.log. ولرؤية كل ما يتجاهله Git حالياً أضف --ignored:
git status --short --ignored?? .gitignore?? images/?? important.log?? notes.txt!! .env!! app.log!! build/!! debug.log!! node_modules/العلامة !! تعني «متجاهَل».
الفخ الأشهر: الملف محفوظ من قبل
Section titled “الفخ الأشهر: الملف محفوظ من قبل”.gitignore يؤثر فقط على الملفات غير المتتبَّعة. الملف الذي دخل Git في commit سابق يبقى متتبَّعاً حتى لو أضفته إلى .gitignore. ملف config.json عندنا محفوظ من أول commit. أضفناه إلى .gitignore ثم عدّلناه:
git status --short M .gitignore M config.jsonما زال Git يراقبه! الحل أن تطلب منه إيقاف التتبع مع إبقاء الملف على جهازك:
git rm --cached config.jsonrm 'config.json'git status --short M .gitignoreD config.jsonD تعني أن الملف سيُحذف من المستودع في الـ commit القادم. لكنه باقٍ على القرص، فالخيار --cached يحذف من منطقة التجهيز فقط. بعد الحفظ:
git add .gitignoregit commit -m "إيقاف تتبع config.json"[main b655445] إيقاف تتبع config.json 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 config.jsonمن الآن أي تعديل على config.json لا يظهر في git status.
ملاحظات عملية
Section titled “ملاحظات عملية”- قوالب جاهزة: لا تبدأ من الصفر. عند إنشاء مستودع على GitHub تجد قائمة «Add .gitignore» فيها قالب لكل لغة وإطار عمل.
- تجاهل شخصي: ملفات محررك ونظامك لا تخص بقية الفريق. ضعها في ملف عام على جهازك وعرّفه مرة واحدة:
git config --global core.excludesFile ~/.gitignore_global. - المجلدات الفارغة: Git يتتبع الملفات لا المجلدات، فالمجلد الفارغ لا يُحفظ. العُرف الشائع أن تضع فيه ملفاً فارغاً اسمه
.gitkeep. - أكثر من ملف: يمكن وضع
.gitignoreداخل مجلد فرعي، وتنطبق قواعده على ذلك المجلد وما تحته.
جرّب بنفسك
Section titled “جرّب بنفسك”- في مستودع تجريبي أنشئ الملفات
a.tmpوb.tmpوkeep.tmpومجلداًcacheفيه ملف. - اكتب
.gitignoreيتجاهل كل ملفات.tmpما عداkeep.tmp، ويتجاهل مجلدcache. - تحقق بـ
git status --short --ignored، واسألgit check-ignore -v a.tmpعن السبب. - تحدٍّ: احفظ ملف
settings.localفي commit، ثم أوقف تتبعه بـgit rm --cachedوأضفه إلى.gitignore، وتأكد أن تعديله لم يعد يظهر.
أخطاء شائعة
Section titled “أخطاء شائعة”- إضافة الملف إلى .gitignore بعد حفظه: لا يكفي. أوقف تتبعه بـ
git rm --cached. - نسيان
--cached:git rm config.jsonبدونها يحذف الملف من القرص أيضاً. - الاستثناء قبل القاعدة:
!important.logثم*.logيتجاهل الملف، لأن القاعدة الأخيرة هي التي تفوز. - مسافات زائدة: مسافة في آخر السطر تصبح جزءاً من النمط فلا يطابق شيئاً.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أضفت secret.txt إلى .gitignore لكنه محفوظ في commit سابق. ماذا يحدث عند تعديله؟
.gitignore يؤثر على الملفات غير المتتبَّعة فقط. لإيقاف التتبع استخدم git rm --cached.
سؤال
ما معنى السطر !keep.log في ملف .gitignore؟
علامة التعجب تستثني الملف من قاعدة تجاهل جاءت قبلها.
الخلاصة
Section titled “الخلاصة”- تجاهل ما يُولَّد تلقائياً وما هو سري، واحفظ ما كتبته بيدك.
*.logلنوع ملفات، وbuild/لمجلد، و/fileللجذر فقط، و!للاستثناء.git check-ignore -vيشرح سبب التجاهل، وgit status --ignoredيعرض المتجاهَل.- الملف المتتبَّع لا يتأثر بـ
.gitignore: أوقف تتبعه بـgit rm --cached. - السر الذي دخل التاريخ مكشوف: غيّره فوراً.