GITIGNORE(5) Git Manual GITIGNORE(5)

gitignore - مشخص کردن فایل‌های ردیابی‌نشده برای نادیده گرفتن توسط گیت

$XDG_CONFIG_HOME/git/ignore, $GIT_COMMON_DIR/info/exclude, .gitignore

یک فایل gitignore فایل‌های عامدانه ردیابی‌نشده‌ای را مشخص می‌کند که گیت باید آن‌ها را نادیده بگیرد. فایل‌هایی که از قبل توسط گیت ردیابی می‌شوند تحت تاثیر قرار نمی‌گیرند؛ برای جزئیات به بخش نکات (NOTES) در ادامه مراجعه کنید.

هر سطر در یک فایل gitignore یک الگو را مشخص می‌کند. هنگام تصمیم‌گیری درباره نادیده گرفتن یک مسیر، گیت معمولاً الگوهای gitignore را از چندین منبع بررسی می‌کند که ترتیب اولویت آن‌ها از بالاترین به پایین‌ترین به شرح زیر است (در یک سطح اولویت یکسان، آخرین الگوی منطبق نتیجه را تعیین می‌کند):

•الگوهای خوانده‌شده از خط فرمان برای دستوراتی که از آن‌ها پشتیبانی می‌کنند.
•الگوهای خوانده‌شده از یک فایل .gitignore در همان دایرکتوری مسیر، یا در هر دایرکتوری والد (تا بالاترین سطح درخت کاری)، به طوری که الگوهای موجود در فایل‌های سطوح بالاتر توسط الگوهای موجود در فایل‌های سطوح پایین‌تر تا دایرکتوری حاوی فایل بازنویسی می‌شوند. این الگوها نسبت به مکان فایل .gitignore مطابقت داده می‌شوند. یک پروژه معمولاً چنین فایل‌های .gitignore را در مخزن خود قرار می‌دهد که حاوی الگوهایی برای فایل‌های تولیدشده به عنوان بخشی از ساخت پروژه است.
•الگوهای خوانده‌شده از $GIT_COMMON_DIR/info/exclude.
•الگوهای خوانده‌شده از فایل مشخص‌شده توسط متغیر پیکربندی core.excludesFile.

اینکه یک الگو در کدام فایل قرار گیرد بستگی به نحوه استفاده از آن الگو دارد.

•الگوهایی که باید نسخه‌بندی شوند و از طریق کلون به سایر مخازن توزیع گردند (یعنی فایل‌هایی که همه توسعه‌دهندگان می‌خواهند نادیده گرفته شوند) باید در یک فایل .gitignore قرار گیرند.
•الگوهایی که مختص یک مخزن خاص هستند اما نیازی به اشتراک‌گذاری با سایر مخازن مرتبط ندارند (مانند فایل‌های کمکی که در داخل مخزن قرار دارند اما مختص گردش کار یک کاربر خاص هستند) باید در فایل $GIT_COMMON_DIR/info/exclude قرار گیرند.
•الگوهایی که کاربر می‌خواهد گیت در همه شرایط آن‌ها را نادیده بگیرد (مانند فایل‌های پشتیبان یا موقتی تولیدشده توسط ویرایشگر متن منتخب کاربر) عموماً در فایلی قرار می‌گیرند که توسط core.excludesFile در فایل ~/.gitconfig کاربر مشخص شده است. مقدار پیش‌فرض آن $XDG_CONFIG_HOME/git/ignore است. اگر $XDG_CONFIG_HOME تنظیم نشده یا خالی باشد، به جای آن از $HOME/.config/git/ignore استفاده می‌شود.

ابزارهای سطح پایین گیت، مانند git ls-files و git read-tree، الگوهای gitignore مشخص‌شده توسط گزینه‌های خط فرمان یا از فایل‌های مشخص‌شده با گزینه‌های خط فرمان را می‌خوانند. ابزارهای سطح بالاتر گیت، مانند git status و git add، از الگوهای منابع مشخص‌شده در بالا استفاده می‌کنند.

•یک سطر خالی با هیچ فایلی مطابقت ندارد، بنابراین می‌تواند به عنوان جداکننده برای خوانایی بهتر عمل کند.
•سطری که با # آغاز می‌شود به عنوان توضیح در نظر گرفته می‌شود. برای الگوهایی که با علامت هش آغاز می‌شوند، یک بک‌اسلش ("\") در ابتدای آن قرار دهید.
•فاصله‌های انتهایی نادیده گرفته می‌شوند مگر اینکه با بک‌اسلش ("\") نقل‌قول شده باشند.
•پیشوند اختیاری "!" که الگو را نقیض (منفی) می‌کند؛ هر فایل منطبقی که توسط یک الگوی قبلی مستثنی شده بود، مجدداً شامل خواهد شد. اگر یک دایرکتوری والد آن فایل مستثنی شده باشد، شامل کردن مجدد یک فایل امکان‌پذیر نیست. گیت به دلایل عملکردی دایرکتوری‌های مستثنی‌شده را فهرست نمی‌کند، بنابراین هرگونه الگو روی فایل‌های درون آن‌ها تاثیری نخواهد داشت، صرف‌نظر از اینکه در کجا تعریف شده باشند. برای الگوهایی که با یک "!" واقعی آغاز می‌شوند، یک بک‌اسلش ("\") در ابتدای آن قرار دهید، به عنوان مثال: "\!important!.txt".
•اسلش "/" به عنوان جداکننده دایرکتوری استفاده می‌شود. جداکننده‌ها ممکن است در ابتدا، وسط یا انتهای الگوی جستجوی .gitignore وجود داشته باشند.
•اگر یک جداکننده در ابتدا یا وسط (یا هر دو) الگو وجود داشته باشد، آنگاه الگو نسبت به سطح دایرکتوری همان فایل .gitignore خاص سنجیده می‌شود. در غیر این صورت الگو ممکن است در هر سطحی زیر سطح فایل .gitignore نیز مطابقت یابد.
•الگوهای خوانده‌شده از منابع استثنا که خارج از درخت کاری هستند، مانند $GIT_COMMON_DIR/info/exclude و core.excludesFile، به گونه‌ای بررسی می‌شوند که گویی در ریشه درخت کاری مشخص شده‌اند؛ یعنی یک "/" آغازین در چنین الگوهایی، تطبیق را در ریشه مخزن تثبیت می‌کند.
•اگر یک جداکننده در انتهای الگو وجود داشته باشد، آنگاه الگو فقط با دایرکتوری‌ها مطابقت خواهد داشت؛ در غیر این صورت الگو می‌تواند با هر دو مورد فایل‌ها و دایرکتوری‌ها مطابقت داشته باشد.
•برای مثال، الگوی doc/frotz/ با دایرکتوری doc/frotz مطابقت دارد، اما با دایرکتوری a/doc/frotz مطابقت ندارد؛ با این حال frotz/ با frotz و a/frotz که یک دایرکتوری باشند مطابقت دارد (تمام مسیرها نسبت به فایل .gitignore سنجیده می‌شوند).
•یک ستاره "*" با هر چیزی به جز اسلش مطابقت دارد. نویسه "?" با هر نویسه‌ای به جز "/" مطابقت دارد. نماد بازه، مانند [a-zA-Z]، می‌تواند برای تطبیق با یکی از نویسه‌های موجود در یک بازه استفاده شود. برای توضیحات کامل‌تر به fnmatch(3) و پرچم FNM_PATHNAME مراجعه کنید.
•یک بک‌اسلش ("\") می‌تواند برای اسکیپ کردن هر نویسه‌ای استفاده شود؛ برای نمونه، "\*" با یک ستاره واقعی مطابقت دارد (و "\a" با "a" مطابقت می‌کند، اگرچه نیازی به اسکیپ کردن در آنجا نیست). همانند fnmatch(3)، بک‌اسلش در انتهای الگو یک الگوی نامعتبر محسوب می‌شود که هرگز با چیزی مطابقت نمی‌یابد.

دو ستاره متوالی ("**") در الگوهایی که با مسیر کامل نام فایل سنجیده می‌شوند ممکن است معنای ویژه‌ای داشته باشند:

•یک "**" آغازین که پس از آن یک اسلش قرار دارد، به معنای مطابقت در تمام دایرکتوری‌ها است. برای نمونه، "**/foo" با فایل یا دایرکتوری "foo" در هر مکانی مطابقت دارد، درست مانند الگوی "foo". الگوی "**/foo/bar" با فایل یا دایرکتوری "bar" در هر کجایی که مستقیماً زیر دایرکتوری "foo" باشد مطابقت می‌کند.
•یک "/**" انتهایی با همه محتویات درون آن مطابقت دارد. برای نمونه، "abc/**" با تمام فایل‌های داخل دایرکتوری "abc"، نسبت به مکان فایل .gitignore، با عمق نامحدود مطابقت دارد.
•یک اسلش و به دنبال آن دو ستاره متوالی و سپس یک اسلش، با صفر یا چند دایرکتوری مطابقت دارد. برای نمونه، "a/**/b" با "a/b"، "a/x/b"، "a/x/y/b" و غیره مطابقت می‌کند.
•سایر ستاره‌های متوالی به عنوان ستاره‌های معمولی در نظر گرفته می‌شوند و طبق قواعد قبلی تطبیق داده خواهند شد.

متغیر پیکربندی اختیاری core.excludesFile نشان‌دهنده مسیری به فایلی حاوی الگوهای نام فایل‌ها برای مستثنی کردن است، مشابه با $GIT_COMMON_DIR/info/exclude. الگوهای موجود در فایل exclude علاوه بر الگوهای موجود در $GIT_COMMON_DIR/info/exclude استفاده می‌شوند.

هدف از فایل‌های gitignore این است که اطمینان حاصل شود فایل‌های خاصی که توسط گیت ردیابی نمی‌شوند، همچنان ردیابی‌نشده باقی می‌مانند.

برای متوقف کردن ردیابی فایلی که در حال حاضر ردیابی می‌شود، از git rm --cached برای حذف فایل از ایندکس استفاده کنید. سپس می‌توان نام فایل را به فایل .gitignore اضافه کرد تا از ثبت مجدد فایل در کامیت‌های بعدی جلوگیری شود.

گیت هنگام دسترسی به فایل .gitignore در درخت کاری، پیوندهای نمادین را دنبال نمی‌کند. این امر رفتار سیستم را هنگام دسترسی به فایل از ایندکس یا درخت در مقایسه با فایل‌سیستم یکدست نگه می‌دارد.

•الگوی hello.* با هر فایل یا دایرکتوری که نام آن با hello. آغاز شود مطابقت دارد. اگر کسی بخواهد این تطبیق را فقط به همان دایرکتوری محدود کرده و زیردایرکتوری‌های آن را شامل نشود، می‌تواند یک اسلش به ابتدای الگو اضافه کند؛ یعنی /hello.*؛ اکنون الگو با hello.txt و hello.c مطابقت دارد اما با a/hello.java مطابقت نمی‌کند.
•الگوی foo/ با دایرکتوری foo و مسیرهای زیر آن مطابقت خواهد داشت، اما با یک فایل معمولی یا یک پیوند نمادین foo مطابقت نخواهد کرد (این امر با نحوه عملکرد کلی pathspec در گیت سازگار است)
•الگوی doc/frotz و /doc/frotz در هر فایل .gitignore اثر یکسانی دارند. به عبارت دیگر، اگر از قبل یک اسلش میانی در الگو وجود داشته باشد، اسلش ابتدایی تاثیری در تمایز نخواهد داشت.
•الگوی foo/*، با foo/test.json (یک فایل معمولی) و foo/bar (یک دایرکتوری) مطابقت دارد، اما با foo/bar/hello.c (یک فایل معمولی) مطابقت ندارد، زیرا ستاره در الگو با bar/hello.c که حاوی اسلش است مطابقت نمی‌کند.
$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
#       Documentation/gitignore.html
#       file.o
#       lib.a
#       src/internal.o
[...]
$ cat .git/info/exclude
# ignore objects and archives, anywhere in the tree.
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
[...]

مثالی دیگر:

$ cat .gitignore
vmlinux*
$ ls arch/foo/kernel/vm*
arch/foo/kernel/vmlinux.lds.S
$ echo '!/vmlinux*' >arch/foo/kernel/.gitignore

فایل .gitignore دوم مانع از نادیده گرفته شدن arch/foo/kernel/vmlinux.lds.S توسط گیت می‌شود.

مثالی برای مستثنی کردن همه‌چیز به جز یک دایرکتوری خاص foo/bar (به /* توجه کنید - بدون اسلش، نویسه عمومی همه‌چیز درون foo/bar را نیز مستثنی می‌کرد):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

git-rm(1), gitrepository-layout(5), git-check-ignore(1)

بخشی از مجموعه git(1)

2026-06-29 Git 2.55.0