guide

الدليل الكامل لصياغة أنماط .gitignore

شرح التعليقات والهروب والمسافات في نهاية السطر، والنفي !، والشرطة المائلة الأخيرة، والتثبيت، وأحرف البدل * و? و[]، وقواعد ** مع جداول أمثلة.

كل سطر في ملف .gitignore هو نمط واحد. تبدو الصياغة شبيهة بأنماط glob في الصدفة، لكن معناها يتغير كثيرًا بحسب موضع الشرطات المائلة وموضع **. يستند المحتوى أدناه إلى وثائق git الرسمية gitignore(5)، وقد جرى التحقق من الأمثلة مباشرةً باستخدام git 2.50.

الأسطر الفارغة والتعليقات والهروب

المسافات في نهاية السطر غير مرئية وهي سبب شائع للأخطاء. إن لم تعمل قاعدة ما ففعّل إظهار المسافات في المحرر. وتذكّر أن حرف المسافة وحده هو ما يُحذف، أما علامات الجدولة فلا.

الشرطة المائلة الأخيرة: المجلدات فقط

إذا انتهى النمط بـ / فإنه يطابق المجلدات فقط. يتجاهل build/ المجلد build وكل ما فيه، لكنه لا يتجاهل ملفًا اسمه build. وبالعكس، build بلا شرطة يطابق الملفات والمجلدات التي تحمل هذا الاسم.

الشرطة المائلة تثبّت الموضع

إذا احتوى باقي النمط، بعد استبعاد الشرطة الأخيرة، على / في البداية أو في الوسط، فلا يطابق النمط إلا المسارات النسبية إلى المجلد الذي يحتوي ملف .gitignore. يُسمّى هذا غالبًا التثبيت (anchoring). ومن دون / يبحث git عن العناصر المطابقة للاسم على أي عمق تحت ملف .gitignore.

النمطيطابقلا يطابق
debug.logdebug.log، logs/debug.log
/debug.logdebug.loglogs/debug.log
logs/debug.loglogs/debug.logapp/logs/debug.log
doc/frotz/المجلد doc/frotz/a/doc/frotz/
frotz/المجلدان frotz/ وa/frotz/الملف frotz

الصف الثالث هو الأكثر إرباكًا. يحتوي logs/debug.log على شرطة في الوسط، فيُثبَّت في الجذر ويعادل إضافة / في أوله. لالتقاط logs/debug.log على أي عمق استخدم **/logs/debug.log.

أحرف البدل: * و? و[ ]

النجمتان **

لا يحمل ** معنى خاصًا إلا عندما يلتصق بشرطات مائلة.

الصيغةالمعنىأمثلة
**/foofoo على أي عمقfoo، a/foo، a/b/foo
**/logs/debug.loglogs/debug.log على أي عمقlogs/debug.log، app/logs/debug.log
abc/**كل ما داخل abcabc/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

يمكنك إعادة إنتاج هذا الجدول تمامًا بلصق القواعد والمسارات في تبويب اختبار الأنماط في المولّد.

المراجع

← السابقما الذي يُتجاهل وما الذي يُودع في commit