الدليل الكامل لصياغة أنماط .gitignore
شرح التعليقات والهروب والمسافات في نهاية السطر، والنفي !، والشرطة المائلة الأخيرة، والتثبيت، وأحرف البدل * و? و[]، وقواعد ** مع جداول أمثلة.
كل سطر في ملف .gitignore هو نمط واحد. تبدو الصياغة شبيهة بأنماط glob في الصدفة، لكن معناها يتغير كثيرًا بحسب موضع الشرطات المائلة وموضع **. يستند المحتوى أدناه إلى وثائق git الرسمية gitignore(5)، وقد جرى التحقق من الأمثلة مباشرةً باستخدام git 2.50.
الأسطر الفارغة والتعليقات والهروب
- السطر الفارغ لا يطابق أي شيء. استخدمه فاصلًا لتسهيل القراءة.
- السطر الذي يبدأ بـ
#تعليق. لتجاهل ملف يبدأ اسمه بـ#أضف شرطة مائلة عكسية مثل\#. - المسافات في نهاية السطر تُتجاهل. إن احتجت إلى اسم ملف ينتهي بمسافة فاحمِ المسافة بشرطة مائلة عكسية مثل
foo\. أما المسافات في بداية السطر فتبقى جزءًا من النمط. - السطر الذي يبدأ بـ
!نمط نفي. للملف الذي يبدأ اسمه بـ!اكتب\!important.txt.
المسافات في نهاية السطر غير مرئية وهي سبب شائع للأخطاء. إن لم تعمل قاعدة ما ففعّل إظهار المسافات في المحرر. وتذكّر أن حرف المسافة وحده هو ما يُحذف، أما علامات الجدولة فلا.
الشرطة المائلة الأخيرة: المجلدات فقط
إذا انتهى النمط بـ / فإنه يطابق المجلدات فقط. يتجاهل build/ المجلد build وكل ما فيه، لكنه لا يتجاهل ملفًا اسمه build. وبالعكس، build بلا شرطة يطابق الملفات والمجلدات التي تحمل هذا الاسم.
الشرطة المائلة تثبّت الموضع
إذا احتوى باقي النمط، بعد استبعاد الشرطة الأخيرة، على / في البداية أو في الوسط، فلا يطابق النمط إلا المسارات النسبية إلى المجلد الذي يحتوي ملف .gitignore. يُسمّى هذا غالبًا التثبيت (anchoring). ومن دون / يبحث git عن العناصر المطابقة للاسم على أي عمق تحت ملف .gitignore.
| النمط | يطابق | لا يطابق |
|---|---|---|
debug.log | debug.log، logs/debug.log | — |
/debug.log | debug.log | logs/debug.log |
logs/debug.log | logs/debug.log | app/logs/debug.log |
doc/frotz/ | المجلد doc/frotz/ | a/doc/frotz/ |
frotz/ | المجلدان frotz/ وa/frotz/ | الملف frotz |
الصف الثالث هو الأكثر إرباكًا. يحتوي logs/debug.log على شرطة في الوسط، فيُثبَّت في الجذر ويعادل إضافة / في أوله. لالتقاط logs/debug.log على أي عمق استخدم **/logs/debug.log.
أحرف البدل: * و? و[ ]
- يطابق
*أي سلسلة عدا/(بما في ذلك السلسلة الفارغة). يطابق*.logكلًّا منapp.logوa/b/app.log، لكنlogs/*.logيطابقlogs/app.logفقط وليسlogs/2026/app.log. - يطابق
?حرفًا واحدًا عدا/. يطابقfile?.txtالملفfile1.txtولا يطابقfile10.txt. - يطابق
[a-z]حرفًا واحدًا داخل النطاق، ويطابق[!a-z]أو[^a-z]حرفًا واحدًا خارجه. يلتقط*.py[cod]الامتدادات.pycو.pyoو.pydدفعة واحدة. والأقواس المربعة لا تطابق/أيضًا. - يمكن كذلك استخدام فئات أحرف POSIX مثل
[[:digit:]].
النجمتان **
لا يحمل ** معنى خاصًا إلا عندما يلتصق بشرطات مائلة.
| الصيغة | المعنى | أمثلة |
|---|---|---|
**/foo | foo على أي عمق | foo، a/foo، a/b/foo |
**/logs/debug.log | logs/debug.log على أي عمق | logs/debug.log، app/logs/debug.log |
abc/** | كل ما داخل abc | abc/x، abc/x/y (وليس abc نفسه) |
a/**/b | صفر مجلد أو أكثر بينهما | a/b، a/x/b، a/x/y/b |
في المواضع الأخرى، مثل ** في foo** أو **bar، يتصرف كـ * عادية ولا يعبر الشرطات المائلة. يطابق docs/**/*.pdf كلًّا من docs/manual.pdf وdocs/a/b/manual.pdf لأن /**/ يطابق صفر مجلدات أيضًا.
خلاصة في مثال صغير
# Build output (only the build directory at the root)
/build/
# Log files at any depth, but keep the important log
*.log
!important.log
# All PDFs under docs
docs/**/*.pdf
# A file whose name starts with #
\#scratch.md
| المسار | النتيجة | القاعدة الحاسمة |
|---|---|---|
build/app.js | مُتجاهَل | /build/ |
src/build/app.js | مُتتبَّع | لا شيء |
logs/server.log | مُتجاهَل | *.log |
logs/important.log | مُتتبَّع | !important.log |
docs/api/v1.pdf | مُتجاهَل | docs/**/*.pdf |
#scratch.md | مُتجاهَل | \#scratch.md |
يمكنك إعادة إنتاج هذا الجدول تمامًا بلصق القواعد والمسارات في تبويب اختبار الأنماط في المولّد.
المراجع
- وثائق gitignore الرسمية (git-scm.com)
- GitHub Docs: Ignoring files
- تاريخ التحقق: 2026-09-23 (جرى التحقق من الأمثلة باستخدام git 2.50.1)