حذف الملفات غير المتتبعة في git: طقس clean الآمن
عايِن بـ -nd، احذف بـ -fd، وابلغ المتجاهِل بـ -x — المناطق الثلاث لشجرة عملك، وأسباب «clean لا يحذف شيئاً» الثلاثة، وstash -u كتراجع.
■ مساحة · مسار النثر
git clean -nd يستعرض، git clean -fd يحذف — الحذف بـ clean نهائي؛ سلة المحذوفات لا تدخل أبداً.
clean لا يحذف شيئاً؟ الملفات داخل مجلد غير متتبع (أضف -d)) أو أنها متجاهلة (أضف -x).
تريد أن تكون قابلة للاسترجاع؟ git stash -u قبل التنظيف — لا تراجع بعد -f.
نطاق التأثير
كل ملف في شجرتك يعيش في إحدى ثلاث مناطق — وكل راية من clean تصل إلى حلقة واحدة بالضبط:
clean لا يلمسها أبداً. التعديلات: git restore. الحذف: git rm.
يصل إليها clean -f، ومن خلال -d داخل المجلدات غير المتتبعة
لا يصل إليها إلا مع -x (أو -X للمتجاهلة فقط)
الحاوية الرابعة هي الفخ: الملفات المتجاهلة لا تظهر حتى كسطور ?? — التنظيف العادي يتخطاها بصمت، ولهذا يبدي أنه «لا يحذف شيئاً»
ماذا يعني «غير متتبع»
غير متتبع يعني أن git يرى الملف على القرص لكنه لم يُطلب منه أبداً تتبعه — ليس في الفهرس، ولا تاريخ للالتزامات. git status تصنف كل شيء إلى حاويات، وكل حاوية تحتاج أداة حذف مختلفة:
$ git status --short
M src/app.ts # modified: tracked, changed
?? notes.txt # untracked: new file git doesn't know
?? build/ # untracked directory: entirely new to git
الملفات المتتبعة-المعدلة تُعاد عبر git restore أو تُرحل إلى التزام — git clean لا تلمسها. فقط ?? هي منطقة clean. إذا كانت مشكلتك الحقيقية ملفاً متتبعاً ما كان يجب أن يُلتزم أصلاً، فـ clean هي الأداة الخطأ — تلك عمل git rm --cached أو reset لآخر التزام.
الطقس
# 1. see exactly what will be deleted (dry run — deletes nothing)
git clean -nd
# Would remove:
# notes.txt
# build/
# 2. confirm nothing precious is in the list, then delete for real
git clean -fd
verify: git clean -nd → يطبع «Would remove notes.txt build/» · بعد -fd: git status --short لا يعرض أي سطر ??
عادة تستحق النسخ: تعامل مع git clean -nd تماماً كـ git diff — تنظُر قبل الالتزام، وتنظر قبل التنظيف. راية براية:
-f/--force— إلزامي. يحذف فعلاً الملفات غير المتتبعة. بدونه يرفض git ويطبع تحذيراً — سكة أمان مقصودة.-d— التسلل داخل المجلدات غير المتتبعة. العادي-fيحذف فقط الملفات غير المتتبعة في المستوى الأعلى ويذكر المجلدات التي رفض لمسها.-n/--dry-run— أظهر ما سيحذفه. دائماً أولاً.-x— احذف أيضاً المتجاهلة الملفات (node_modules، مخرجات البناء،.env).-X— احذف فقط الملفات المتجاهلة، مع إبقاء غير المتتبعة-غير المتجاهلة.-i— وضع تفاعلي؛ مفيد عندما تكون قائمة المعاينة طويلة.-e <path>— استثنِ — «نظّف كل شيء إلا notes.txt» هيgit clean -fd -e notes.txt.
«CLEAN لا يحذف شيئاً» — الأسباب الثلاثة
- الملفات داخل مجلد غير متتبع. مع فقط
-f، يحذف git الملفات المتفرقة لكنه يقف عند المجلدات — بل يبلّغ عنWould remove build/دون حذفها في تشغيل حقيقي.-d:git clean -fd. - الملفات متجاهلة.
node_modules/,dist/,.venv/— المسارات المتجاهلة غير مرئية لتنظيف عادي؛ المعاينة لن تسردها أيضاً. اطلبها صراحةً:git clean -fdx. - مستودع git متداخل أو وحدة فرعية في الطريق. git لا يحذف محتوى مستودع آخر من الخارج أبداً. أزل الوحدة الفرعية كما ينبغي أو مرّر
--forceمرتين (git clean -ffd) — الأول أفضل.
إذا لم تُسرِد المعاينة شيئاً لكن git status ما زال يعرض ?? أسطراً، فأنت على الأغلب في شجرة العمل الخطأ — git rev-parse --show-toplevel وتأكد أنك في المستودع الذي قصدت تنظيفه.
مجلد واحد في المرة
حدّد نطاق التنظيف بتمرير مسار — كل ما عدا ذلك يُترك. المسار نسبي لمجلدك الحالي: من جذر المستودع يشمل المستودع كله؛ من مجلد فرعي، تلك الشجرة الفرعية:
git clean -fd build/ # only inside build/
git clean -fd src/generated # one specific tree
انزع دون حذف
عندما تُظهر المعاينة ملفات قد تحتاجها لاحقاً، لا تقامر — احفظ أولاً، نظف ثانياً. git stash -u ينقل الملفات غير المتتبعة خارج الشجرة لكنه يبقيها قابلة للاسترجاع — تلك هي دلالة «انزع دون حذف» التي يبحث عنها الناس فعلاً:
# stash untracked files (including ignored with -a) without deleting
git stash push --include-untracked
git clean -fd # tree is clean
git stash pop # bring them back when needed
verify: git stash list → stash@{0} يحتفظ بما رفعه git stash -u
لمعاينة يمكنك الاحتفاظ بها: git clean -nd > clean-plan.txt. لا تراجع بعد git clean -f: المحذوف يعني مفقوداً — سلة المحذوفات لا تدخل أبداً.
CLEAN ضد RM ضد RESTORE
| الأمر | يمسّ | يزيل من القرص | متى تستخدمه |
|---|---|---|---|
git clean -fd | ملفات/مجلدات غير متتبعة | نعم | حذف ملفات لم يتتبعها git قط |
git clean -fdx | غير متتبعة + متجاهلة | نعم | تصفير كامل يشمل node_modules، مخرجات البناء |
git rm <file> | ملفات متتبعة | نعم (في الفهرس) | حذف ملف و تسجيل الحذف في git |
git rm --cached <file> | ملفات متتبعة | لا | أوقف تتبع ملف، أبقه على القرص |
git restore <file> | ملفات متتبعة | لا | ارفض التعديلات المحلية، أبقِ الملف |
القاعدة في سطر واحد: clean يدير ما لا يعرفه git؛ وrm وrestore يديران ما يعرفه. الخلط بينهما هو كيف يفقد الناس عملهم — تشغيل git clean -fdx مع الاعتقاد أنه يتصرف كـ git restore.
08ما لا ينبغي تشغيله أبداً
- لا تشغّل أبداً
git clean -fdxعشوائياً داخل monorepo أو workspace. يحذف كل مجلد متجاهل — كلnode_modules، كل virtualenv، وكل.envمحلي في الشجرة..envقد لا يُستعاد إطلاقاً. - لا تصنع alias لـ clean بـ force مضمّن فيه أبداً.
git config alias.wipe "clean -fd"يبدو فعالاً حتى تخطئ في المسار. أبقِ المعاينة على بُعد مفتاح واحد واجعلها طقساً من أمرين: عايِن ثم احذف.
سير العمل كله، مكثفاً:
git status --short # what's in the tree?
git clean -nd # preview: what WOULD go?
git clean -fd # delete untracked files + directories
git clean -fdX # (optional) clear only ignored build output
git status --short # confirm: working tree clean
عايِن، احذف، تحقق — ثلاثون ثانية، صفر ندم، و git status يُقرأ أخيراً نظيفاً من جديد. قريب هذه المشكلة: .gitignore قواعد تبدو كأنها لا تفعل شيئاً — إن كانت قواعدك تُتجاهل، فالغالب ملفات متتبعة لا صناعة قواعد. وشجرة مرتبة قبل fork sync مباشرة تُصغر سطح الدمج — أرخص تأمين ضد التعارضات.
git status --short أعلاه هو الشكل الذي يطبعه كل مستودع فعلاً.نهاية صفحة التنظيف · لم يُجلب شيء · كل شيء محلي