FreeToGenerate.com

يردّد الجميع أنّ آخر نمطٍ مطابقٍ هو الغالب. وهذا لا يفسّر لماذا لا يفعل ‎!build/keep.txt شيئًا تحت ‎build/‎ — وهنا ترى السطر الذي قرّر فعلًا.

التقنيات

عام
عام
عام
عام
عام

ما وُسم بالعامّ موضعُه ملفُّك ‏~/.gitignore_global لا مستودعٌ بعينه. فمجلَّد محرِّرك شأنُك أنت لا شأنُ المشروع.

2 نمطًا

هذه النفياتُ لا يمكن أن يكون لها أثر

  • 2: !build/keep.txt

ثمّة نمطٌ سابقٌ يستبعد مجلَّدًا أعلى من الذي تحاول إعادة تضمينه. فاستبعد محتوى المجلَّد بدل المجلَّد نفسِه — شرطةٌ مائلة ونجمةٌ في آخره بدل الشرطة وحدها — عندئذٍ يبدأ النفيُ بالعمل.

أيُهمَل هذا المسار؟

مُهمَل

قرّره السطر 1: build/

build اتُّخذ القرار على المجلَّد الأب لا على الملف. فجِت لا ينظر قطُّ داخل مجلَّدٍ مستبعَد، ومن ثمّ لا يُبلَغ أيُّ نفيٍ تحته.

القوالبُ مختارةٌ من github/gitignore، وهي متروكةٌ للملك العام برخصة CC0. وهي نقطةُ بداية لا مرجعية: فالقالبُ الذي لم يلحق بمجلَّد بناءٍ جديد ناقصٌ لا خاطئ. أُخذت اللقطة في 2026-08-02

متوفر أيضًا بلغات أخرى: English · Español · Português · Français

مولّد ملفّ gitignore

ركّب ملفَّ ‎.gitignore من قوالب، ثم اختبر عليه مسارًا حقيقيًّا: الحكمُ والسطرُ الذي قرّره والمجلَّدُ الذي اتُّخذ القرار عليه.

ما مولّد ملفّ gitignore؟

ملفُّ ‎.gitignore يخبر جِت بالمسارات التي عليه أن يدعها وشأنها: مخرجاتِ البناء، ومجلَّداتِ الاعتماديات، وفضلاتِ المحرِّر، وكلَّ ما لا تريده في التاريخ. والمولّد يعطيك ملفَّ بدايةٍ معقولًا للتقنيات التي تستعملها، فلا تكتب node_modules عن ظهر قلبٍ كلَّما بدأت مستودعًا.

والشطرُ المولِّد هو الشطر السهل، وهو وحده قليل القيمة: فلا تُتحقَّق قائمةُ أنماطٍ بالنظر إليها. لذلك تقرن هذه الصفحة به الشطرَ الذي يمكن التحقق منه: ألصق مسارًا فتخبرك أيُهمله جِت، وأيُّ سطرٍ اتّخذ ذلك القرار.

وفي ذلك الشطر الثاني تكمن المفاجآت. فملفُّ ‎.gitignore ليس قائمةَ ملفات، بل مجموعةُ قواعدَ لها أسبقيةٌ وتثبيتٌ ودلالاتُ مجلَّدات، والقاعدةُ التي يستشهد بها الجميع ناقصةٌ نقصًا ينتهي بأن يعضّ كلَّ أحدٍ تقريبًا.

كيف تستعمله

  1. أشّر على التقنيات التي تستعملها. يُركَّب الملفُّ من قوالبَ بعنوانٍ لكلِّ واحد. وما وُسم بالعامّ موضعُه ملفُّك ‎~/.gitignore_global لا المستودع: فمجلَّد محرِّرك شأنُك أنت لا شأنُ المشروع.
  2. عدّل الملفَّ كما تشاء. هي منطقةُ نصٍّ عادية. وإن كان مرادُك الفاحصَ فألصق فيها مباشرةً ملفَّ ‎.gitignore عندك.
  3. اكتب مسارًا واقرأ الحكم. تحصل على «مهمَل» أو «غير مهمَل»، ورقمِ السطر الذي قرّر ونصِّه، وحين ينطبق الأمرُ المجلَّدَ الأبَ الذي اتُّخذ القرارُ عليه فعلًا.

لماذا لا يفعل ‎!build/keep.txt شيئًا، وما الذي يُكتب بدله

القاعدةُ التي يردّدها الجميع أنّ آخر نمطٍ مطابقٍ هو الغالب. وهي صحيحةٌ إلى حدٍّ ما، وتتنبّأ بالجواب الخطأ في أشهر سؤالٍ عن ‎.gitignore. فمع ‎build/‎ في سطرٍ و‎!build/keep.txt في الذي يليه، يبقى الملفُّ مهمَلًا. وجِت يوافق: إن سألتَه سمّى السطر الأول، سطرَ المجلَّد، هو الذي قرّر.

والسببُ أنّ جِت لا يمرّ على قائمةٍ مسطَّحةٍ من الأنماط أمام مسارك. بل يمرّ على مجلَّدات المسار من أعلى إلى أسفل، وما إن يُستبعَد مجلَّدٌ حتى لا ينزل إليه أبدًا. فلا فرصةَ لنمطٍ أسفلَ منه أن يعيد تضمين شيء، لأنّ ما بداخله لا يُنظَر إليه قطّ.

والإصلاحُ حرفٌ واحد. استبعد محتوى المجلَّد بدل المجلَّد: ‎build/*‎ بدل ‎build/‎. عندئذٍ ينزل جِت، ويُبلَغ النفيُ، ويبقى ‎build/keep.txt محفوظًا بينما يظلّ سائرُ ما هناك مهمَلًا. وهذه الأداة تؤشّر لك على الصورة المكسورة: تسرد أيَّ نفيٍ جعلته قاعدةٌ سابقةٌ غيرَ قابلٍ للبلوغ، فتعرف قبل الإيداع لا بعد أن تحتار لماذا لم يظهر الملفُّ قطّ.

وبقيةُ الصياغة تستحق المعرفة كذلك، والفاحصُ يمارسها كلَّها: فالشرطةُ المائلة في أيّ موضعٍ غير الآخر تثبّت النمط على مجلَّد الملف نفسِه، فـ‎/build لا يطابق إلا في الجذر بينما ‎build يطابق على أيّ عمق؛ والشرطةُ في الآخر تحصر النمطَ في المجلَّدات؛ والنجمةُ تقف عند الشرطة أما النجمتان فتعبرانها؛ وعلامةُ التعجب في الأول تنفي، إلا أن تهرّبها.

حدودٌ صريحة

القوالبُ نقطةُ بداية لا مرجعية. وهي مختارةٌ من المجموعة المتروكة للملك العام التي ينشرها github، وتاريخُ أخذ هذه اللقطة مطبوعٌ تحت الأداة. والقالبُ الذي لم يلحق بمجلَّد بناءٍ جديدٍ ناقصٌ، وذلك أمرٌ تراه وتصلحه في منطقة النص؛ وهو غيرُ أن يكون خاطئًا.

ثم إنّ هذه الصفحة تنظر في ملفِّ ‎.gitignore واحدٍ في كلّ مرة. والمستودعُ الحقيقي قد يحمل عدّةَ ملفات — واحدًا لكلّ مجلَّد، وفوقها ‎.git/info/exclude، وفوقها ملفُّك العام — وجِت يطبّقها من الأعمّ إلى الأخصّ، فقاعدةٌ في مجلَّدٍ فرعيٍّ تغلب قاعدةً في الجذر. والفاحصُ يجيب عن الملفّ الذي في الصندوق، منسوبًا إلى موضع ذلك الملف.

وأمران آخران لا يخبرك بهما المسارُ وحده. فالملفُّ المتتبَّع أصلًا يظلّ متتبَّعًا مهما أضفتَه إلى ‎.gitignore، لأنّ قواعد الإهمال تسري على الملفات غير المتتبَّعة؛ ويلزم ‎git rm --cached للكفّ عن تتبّعه. ثم إنّ هذه تنظر في الأنماط لا في قرصك، فتعامل المسارَ كما تكتبه بالضبط: ومربّعُ الاختيار موجودٌ لأنّ كونَ الشيء مجلَّدًا أو لا يغيّر الجواب للأنماط المنتهية بشرطة.

وأخيرًا، فُحصت الأحكامُ مقابل جِت نفسِه لا مقابل تطبيقٍ آخر: مسحٌ مولَّدٌ من 252 تركيبةً من نمطٍ ومسار، شُغّل في مستودعٍ حقيقي، دون خلافٍ واحد.

لماذا هو مجاني؟

لأن تشغيله لا يكلّف شيئًا. فالمطابقةُ تجري في متصفحك؛ لا يُرفع ملف، ولا يرى مساراتِك أيُّ خادم، ولا حسابَ في الأمر.

والقوالبُ من الملك العام، وقواعدُ الأنماط من سلوك جِت الموثَّق نفسِه، والاختبارُ الذي يقابل هذا التطبيق بجِت محفوظٌ إلى جانب الشفرة.