guide

لماذا يُتجاهل الملف؟ التصحيح باستخدام 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

لرؤية المسارات غير المطابقة أيضًا أضف --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.

أسباب شائعة لعدم عمل القواعد

  1. الملف مُتتبَّع مسبقًا. وهذا الأكثر شيوعًا. إذا أظهر git ls-files <المسار> شيئًا فالملف مُتتبَّع. أوقف تتبعه بـ git rm --cached.
  2. المجلد الأب مستبعد. مع تجاهل dir/ لا يكون لـ !dir/file أي أثر. استبدله بـ dir/*.
  3. الترتيب معكوس. إذا عادت قاعدة أوسع بعد النفي فهي التي تفوز. يكشف رقم السطر في check-ignore -v ذلك فورًا.
  4. المسافات في نهاية السطر. تُحذف المسافة في نهاية *.log ، لكن المسافات قبل النمط والأحرف غير المرئية مثل المسافة كاملة العرض تبقى جزءًا منه.
  5. اتجاه الشرطة المائلة. يستخدم gitignore الفاصل / فقط حتى في Windows. في build\output تُقرأ الشرطة العكسية على أنها هروب فلا تعمل القاعدة كما يُراد.
  6. سوء فهم التثبيت. يحتوي config/local.json على شرطة في الوسط فلا يطابق إلا config في الجذر. لأي عمق استخدم **/config/local.json.
  7. حالة الأحرف. في البيئات التي تكون فيها قيمة core.ignorecase هي false (عادةً Linux) يختلف *.JPG عن *.jpg. وغالبًا ما تكون القيمة true في المستودعات المنشأة على macOS أو Windows، فقد تعمل القاعدة محليًّا وتفشل في CI.

تحقّق أولًا في المتصفح

إذا أردت مقارنة النتائج مع تغيير القواعد قبل تطبيقها على المستودع، فتبويب اختبار الأنماط في هذا الموقع مفيد. الصق القواعد وقائمة المسارات لترى لكل مسار النتيجة والقاعدة الحاسمة (مع رقم السطر) والحالات المتجاهَلة بسبب المجلد الأب. يمكن أن تكون قائمة المسارات ناتج git ls-files أو find . -type f. أما الحكم النهائي الذي يشمل ملفات .gitignore في المجلدات الفرعية والإعداد العام فيُتحقق منه في المستودع بـ git check-ignore -v.

المراجع

← السابقتجاهل ملفات سبق إيداعها في commit