لماذا يُتجاهل الملف؟ التصحيح باستخدام git check-ignore
كيفية معرفة القاعدة التي تتجاهل ملفًا باستخدام git check-ignore -v وgit status --ignored وgit ls-files، وفحص سبعة أسباب شائعة لعدم عمل القواعد.
حين تكثر القواعد تظهر أسئلة مثل «لماذا لا يظهر هذا الملف؟» أو «لماذا ما زال يظهر؟». لدى git أوامر تجيب عن ذلك.
git check-ignore -v
git check-ignore -v logs/app.log src/build/keep.txt
يأتي الناتج بالصيغة المصدر:رقم_السطر:النمط<TAB>المسار.
.gitignore:3:*.log logs/app.log
- المصدر هو الملف الذي يحتوي القاعدة:
.gitignoreأوsub/.gitignoreأو.git/info/excludeأو مسار الملف العام. - يوضح رقم السطر والنمط السطر المقصود بالضبط.
- إذا لم يظهر شيء فالمسار غير مُتجاهَل.
- مع
-vتظهر أيضًا الحالات المعاد تضمينها بـ!مع قاعدة النفي، مثل.gitignore:4:!keep.log keep.log. - للملفات التي استُبعد مجلدها الأب تظهر قاعدة ذلك المجلد. فمثلًا إذا كان السبب القاعدة
logs/يكون الناتج.gitignore:1:logs/ logs/keep.txt.
لرؤية المسارات غير المطابقة أيضًا أضف --non-matching (-n).
الملفات المُتتبَّعة: --no-index
لأن قواعد التجاهل لا تنطبق على الملفات المُتتبَّعة مسبقًا، لا يعرض check-ignore افتراضيًّا شيئًا لها. إذا أردت فقط معرفة ما إذا كانت قاعدة ما تطابق الملف فأضف --no-index.
$ git check-ignore -v app.log # tracked, no output
$ git check-ignore -v --no-index app.log
.gitignore:3:*.log app.log
عرض الملفات المتجاهَلة
# show ignored items together with the status (!! marker)
git status --ignored --short
# list every ignored file, one by one
git ls-files --others --ignored --exclude-standard
# tracked files that match ignore rules
git ls-files -ci --exclude-standard
عندما يُتجاهل مجلد كامل يعرضه git status --ignored عنصرًا واحدًا مثل !! logs/. ولعرض الملفات واحدًا واحدًا استخدم ls-files.
أسباب شائعة لعدم عمل القواعد
- الملف مُتتبَّع مسبقًا. وهذا الأكثر شيوعًا. إذا أظهر
git ls-files <المسار>شيئًا فالملف مُتتبَّع. أوقف تتبعه بـgit rm --cached. - المجلد الأب مستبعد. مع تجاهل
dir/لا يكون لـ!dir/fileأي أثر. استبدله بـdir/*. - الترتيب معكوس. إذا عادت قاعدة أوسع بعد النفي فهي التي تفوز. يكشف رقم السطر في
check-ignore -vذلك فورًا. - المسافات في نهاية السطر. تُحذف المسافة في نهاية
*.log، لكن المسافات قبل النمط والأحرف غير المرئية مثل المسافة كاملة العرض تبقى جزءًا منه. - اتجاه الشرطة المائلة. يستخدم gitignore الفاصل
/فقط حتى في Windows. فيbuild\outputتُقرأ الشرطة العكسية على أنها هروب فلا تعمل القاعدة كما يُراد. - سوء فهم التثبيت. يحتوي
config/local.jsonعلى شرطة في الوسط فلا يطابق إلاconfigفي الجذر. لأي عمق استخدم**/config/local.json. - حالة الأحرف. في البيئات التي تكون فيها قيمة
core.ignorecaseهيfalse(عادةً Linux) يختلف*.JPGعن*.jpg. وغالبًا ما تكون القيمةtrueفي المستودعات المنشأة على macOS أو Windows، فقد تعمل القاعدة محليًّا وتفشل في CI.
تحقّق أولًا في المتصفح
إذا أردت مقارنة النتائج مع تغيير القواعد قبل تطبيقها على المستودع، فتبويب اختبار الأنماط في هذا الموقع مفيد. الصق القواعد وقائمة المسارات لترى لكل مسار النتيجة والقاعدة الحاسمة (مع رقم السطر) والحالات المتجاهَلة بسبب المجلد الأب. يمكن أن تكون قائمة المسارات ناتج git ls-files أو find . -type f. أما الحكم النهائي الذي يشمل ملفات .gitignore في المجلدات الفرعية والإعداد العام فيُتحقق منه في المستودع بـ git check-ignore -v.
المراجع
- وثائق git-check-ignore الرسمية
- وثائق git-status الرسمية: --ignored
- وثائق git-ls-files الرسمية
- تاريخ التحقق: 2026-09-23 (جرى التحقق من صيغة الناتج باستخدام git 2.50.1)