guide

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

كيفية إيقاف تتبع الملفات التي تظل ظاهرة بعد إضافتها إلى .gitignore باستخدام git rm --cached، والعثور على الملفات المُتتبَّعة المطابقة للقواعد، وما يجب فعله إذا أُودع سرٌّ في commit.

هذا أكثر الأسئلة شيوعًا. لا ينطبق .gitignore إلا على الملفات التي لم تُتتبَّع بعد. الملف الذي أُودع في commit مرة واحدة يظل يُظهر تغييراته حتى بعد إضافة القاعدة. لإيقاف تتبعه يجب إخراجه من الفهرس (منطقة التجهيز).

ملف واحد أو مجلد واحد

# 1) add the rule to .gitignore (e.g. .env, dist/)
# 2) remove from the index only — the real file stays in the working tree
git rm --cached .env
git rm -r --cached dist/
# 3) commit
git commit -m "Stop tracking .env and dist"

المفتاح هو --cached. من دون هذا الخيار يحذف git rm الملف من مجلد العمل أيضًا. وتحتاج المجلدات إلى -r.

العثور على الملفات المُتتبَّعة المطابقة للقواعد

لمعرفة ما يتأثر بعد تطبيق قالب جديد استخدم الأمر التالي.

git ls-files -ci --exclude-standard

يعني -c الملفات المُتتبَّعة، و-i ما يطابق قواعد التجاهل فقط، و--exclude-standard تطبيق .gitignore و.git/info/exclude والإعداد العام. إذا كانت القائمة صحيحة فيمكن إيقاف تتبعها كلها دفعة واحدة.

# bash / zsh
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached --
# PowerShell
git -c core.quotePath=false ls-files -ci --exclude-standard | ForEach-Object { git rm --cached -- "$_" }

يبني تبويب إلغاء التتبع في المولّد هذه الأوامر بحسب الصدفة التي تستخدمها.

إعادة التطبيق على كل شيء

إذا غيّرت .gitignore كثيرًا فمن الشائع أيضًا إفراغ الفهرس ثم إضافة كل شيء من جديد.

git rm -r --cached .
git add .
git commit -m "Apply .gitignore"

يطبّق git add . قواعد التجاهل عند الإضافة، فتبقى الملفات المتجاهَلة خارجًا. لكن راجع قائمة الحذف بـ git status قبل الـ commit. ففي المستودعات التي يختلف فيها إعداد نهايات الأسطر (core.autocrlf) قد تظهر ملفات كثيرة على أنها معدّلة.

الأثر على الآخرين

بعد دفع الـ commit الذي يوقف التتبع، يُحذف الملف من مجلد العمل لدى كل من يسحب ذلك الـ commit عبر pull. فمن منظور git، أُزيل الملف من المستودع. إذا كان ملفًّا يحتاجه كل شخص، مثل .env أو إعدادات بيئة التطوير، فنبّه الآخرين مسبقًا ليحتفظوا بنسخة احتياطية.

إذا دُفع سرٌّ بالفعل

إيقاف التتبع لا يؤثر إلا في الـ commit اللاحقة. فالملف يبقى في الـ commit القديمة ويمكن لأي شخص استخراجه من السجل. الترتيب كالتالي:

  1. ألغِ المفاتيح وكلمات المرور المكشوفة وأصدر بدائل لها أولًا. هذه أهم خطوة.
  2. أوقف تتبع الملف وأضفه إلى .gitignore.
  3. عند الحاجة احذف الملف من السجل بأداة مثل git filter-repo ثم نفّذ دفعًا قسريًّا. لا تُحذف النسخ التي استُنسخت أو تفرّعت مسبقًا، لذا لا تغني هذه الخطوة عن الخطوة 1.

assume-unchanged وskip-worktree ليستا للتجاهل

يُخفي git update-index --assume-unchanged و--skip-worktree تغييرات ملف مُتتبَّع مؤقتًا، لكن الملف يبقى مُتتبَّعًا.

وتنصح وثائق git نفسها بعدم استخدام هذين الخيارين لتجاهل تغييرات الملفات المُتتبَّعة. أما ملفات الإعداد المشتركة فالأسلم إيداع config.example.json وتجاهل config.json الحقيقي.

المراجع

← السابققواعد تجاهل خاصة بك عبر .git/info/exclude