الخلاصة: لحذف الملفات غير المتتبعة في git، شغّل git clean -fd — لكن عاين دائمًا بـ git clean -nd أولًا، لأن clean يحذف نهائيًا ولا يمر عبر سلة المحذوفات أبدًا. استخدم -f للملفات، و-fd للملفات والمجلدات، و-fdx إذا كان مخرجات البناء المتجاهلة يجب أن تذهب هي الأخرى. أكثر شكوى تكرارًا — “git clean لا يحذف ملفاتي غير المتتبعة” — تعني في الغالب أن الملفات تسكن داخل مجلد غير متتبع (أضف -d) أو أنها ملفات متجاهلة (أضف -x). الفوضى غير المتتبعة منتج طبيعي للتجارب والبناء والسكربتات المجاورة للاستنساخ؛ يعرض هذا الدليل كيف تعاين كل عملية حذف، وتحذف ملفات مجلد واحد فقط، وأي تركيبات لا تشغّلها أبدًا في مستودع تهمك.
ماذا تعني “الملفات غير المتتبعة” في git status؟
غير متتبعة تعني أن git يرى الملف على القرص لكن أحدًا لم يأمره بتتبعه — ليس في الفهرس ولا له تاريخ commits. يجمع git status كل شيء في ثلاث سلال:
$ git status --short
M src/app.ts # معدل: متتبع، تغيّر
?? notes.txt # غير متتبع: ملف جديد لا يعرفه git
?? build/ # مجلد غير متتبع: جديد كليًا على git وهذا التمييز مهم لأن كل سلة تحتاج أداة حذف مختلفة. الملفات المتتبعة المتغيرة تُستعاد بـ git restore أو تُطوى في commit — git clean لن يلمسها. سطور ?? وحدها هي ميدان git clean. أما الملفات المتجاهلة (كل ما يطابقه .gitignore) فهي سلة رابعة مخفية: لا تظهر حتى بـ ??، ويتخطاها git clean ما لم تلتحق صراحة بـ -x.
وإذا كانت مشكلتك الحقيقية ملفًا متتبعًا ما كان ينبغي أن يُرفع أصلًا، فالتنظيف الأداة الخطأ — تلك شغلانة git rm --cached، أو تراجع عن آخر commit كما في التراجع عن آخر commit مع الاحتفاظ بالتغييرات.
كيف أحذف الملفات غير المتتبعة في git؟
الأمر الجوهري git clean -f. بلا -f يرفض git حذف أي شيء ويطبع تحذيرًا فحسب — حماية مقصودة. الروتين الكامل هكذا:
# 1. شاهد بالضبط ما سيحذف (تجربة جافة — لا يحذف شيئًا)
git clean -nd
# Would remove:
# notes.txt
# build/
# scratch/
# 2. تأكد أن لا شيء ثمين في القائمة، ثم احذف فعلًا
git clean -fd خيارًا خيارًا:
-f/--force— إلزامي. يحذف الملفات غير المتتبعة فعلًا.-d— يتسلل إلى المجلدات غير المتتبعة.-fالمجردة تحذف الملفات غير المتتبعة في القمة فقط وتعلن المجلدات التي رفض لمسها.-n/--dry-run— يعرض ما سيحذف. شغّله أولًا دائمًا.-x— يحذف أيضًا الملفات المتجاهلة (node_modules، مخرجات البناء،.env).-X— يحذف الملفات المتجاهلة فقط، ويُبقي غير المتتبعة غير المتجاهلة.-i— الوضع التفاعلي؛ ينفع حين تكون قائمة المعاينة طويلة.
عادة تستحق النسخ: عامِل git clean -nd معاملة git diff — تنظر قبل أن commit، تنظر قبل أن تنظف.
لماذا لا يحذف git clean ملفاتي غير المتتبعة؟
ثلاثة أسباب حقيقية، بترتيب شيوع اللسع:
1. الملفات داخل مجلد غير متتبع. بـ -f وحدها يحذف git الملفات غير المتتبعة السائبة ويتوقف عند المجلدات، حتى أنه يعلن Would remove build/ دون حذفها في التشغيل الحقيقي. أضف -d:
git clean -fd 2. الملفات متجاهلة بـ gitignore. node_modules/ وdist/ و.venv/ — المسارات المتجاهلة خفية عن clean المجرد. لن تسرد التجربة الجافة، ولن يزيلها التنظيف. التحق صراحة:
git clean -fdx # الملفات والمجلدات غير المتتبعة + المتجاهلة 3. مستودع git متداخل أو submodule يقف في الطريق. لا يحذف git أبدًا محتوى مستودع آخر من الخارج. أزل الـ submodule بالطريقة الصحيحة أو مرر --force مرتين (git clean -ffd)، وفضّل الخيار الأول.
وإذا سردت التجربة الجافة شيئًا ولا يزال git status يعرض إدخالات ??، فأنت على الأرجح في شجرة عمل خاطئة — شغّل git rev-parse --show-toplevel وتأكد أنك داخل المستودع الذي قصدت تنظيفه.
كيف أحذف الملفات غير المتتبعة من مجلد محدد فقط؟
قيّد التنظيف بتمرير مسار — يُترك كل ما عداه وشأنه:
git clean -fd build/ # داخل build/ فقط
git clean -fd src/generated # شجرة واحدة محددة هذا هو الجواب عن “أريد حذف الملفات والمجلدات غير المتتبعة في build/ مع إبقاء ملاحظاتي المؤقتة في جذر المستودع”. المسار نسبي لمجلدك الحالي، فالتشغيل من الجذر يقيّد كامل المستودع؛ والتشغيل من مجلد فرعي يقيّد تلك الشجرة الفرعية.
كيف أزيل الملفات غير المتتبعة دون حذفها؟
حين تُري التجربة الجافة ملفات قد تحتاجها لاحقًا، لا راهن — احفظ أولًا ونظف ثانيًا:
# خبّئ الملفات غير المتتبعة (والمتجاهلة مع -a) دون حذف
git stash push --include-untracked
git clean -fd # الشجرة صافية
git stash pop # أعدها حين تحتاج ينقل git stash -u الملفات غير المتتبعة خارج الشجرة لكنه يبقيها قابلة للاسترداد — تلك هي دلالات “إزالة دون حذف” التي يبحث عنها الناس فعلًا. ومعاينة تحتفظ بها: git clean -nd > clean-plan.txt يعطيك القائمة الدقيقة قبل الالتزام بأي شيء. لا تراجع بعد git clean -f: المحذوف ذاهب.
git clean مقابل git rm مقابل git 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.
ماذا لا تشغّل git clean عليه أبدًا؟
عادتان تتجنبهان فورًا:
- لا تشغّل
git clean -fdxبمعزل في monorepo أو workspace. إنه يحذف كل مجلد متجاهل — أي كلnode_modulesوكل virtualenv وكل.envمحلي في الشجرة. استعادة ذلك قد تعني ساعة إعادة تثبيت، وملف.envمحذوف قد لا يُسترد أصلًا. - لا تختصر clean بالقوة مدمجة.
git config alias.wipe "clean -fd"تبدو كفؤة حتى تخطئ في المسار. أبقِ التجربة الجافة على مسافة ضغطة (git clean -nd) واجعلها طقسًا من أمرين: عاين ثم احذف.
ومعرفة أخرى مفيدة: تنظيف الملفات غير المتتبعة قبل سحب [مزامنة fork مع upstream مباشرة يصغّر سطح الدمج — الشجرة المرتبة أرخص تأمين ضد التعارضات: مزامنة fork مع upstream خطوة بخطوة.
مسار git clean الآمن، مكثفًا
git status --short # ماذا في الشجرة؟
git clean -nd # معاينة: ماذا سيزول؟
git clean -fd # احذف الملفات والمجلدات غير المتتبعة
git clean -fdX # (اختياري) امسح مخرجات البناء المتجاهلة فقط
git status --short # أكد: شجرة العمل صافية عاين، احذف، تحقق — ثلاثون ثانية، بلا ندم، ويعود git status صافيًا أخيرًا.
— mrsaynothing
— mrsaynothing
ملاحظات ميدانية في الذكاء الاصطناعي وLinux والاستضافة الذاتية.
ناقش هذا المقال على dev.to dev.to ↗
احصل على الشرح التطبيقي التالي بالبريد
رسالة واحدة لكل مقال. أصلح المشكلة وامضِ.
ما هذا؟rsync مقابل scp: أي أمر نسخ تستخدم في لينكس
أعجبتك هذه الكتابات؟ بناء مثل هذا هو عملي. وظّفني