سرفصل‌های آموزشی
آموزش کاربردی گیت برای برنامه نویسان
Gitignore چیست؟

Gitignore چیست؟

Gitignore چیست؟

گیت تمام فایل های پوشه ی شما را در یکی از سه دسته زیر می بیند:

1-دنبال شده – فایلی که در گذشته stage یا Commit شده باشد.

2-دنبال نشده – فایلی که هنوز stage یا Commit نشده است.

3-ignore شده (نادید گرفته شده) – فایلی که به گیت گفته شده است آن را نادیده بگیرد.

به طور معمول فایل هایی ignore می شوند که توسط خود سیستم تولید شده باشند یا نخواهیم آن ها را در مخزن خود Commit  کنیم. چند نمونه ی معمول عبارت است از:

  • فایل های مربوط به وابستگی ها و پکیج های پروژه مانند پوشه ی node_modules یا vendor
  • کد های کامپایل شده مانند فایل های .class و .pyc و...
  • فایل های ایجاد شده هنگام اجرای برنامه مانند .log و .lock و .tmp و...
  • فایل های مخفی شده سیستم مانند DS_Store یا Thumb.db
  • پیکربندی IDE مانند پوشه ی .idea

فایل های ignore شده در فایل مخصوصی به نام .gitignore ثبت می شوند که در مسیر اصلی مخزن قرار می گیرد. دستور خاصی برای ignore کردن یک فایل در گیت وجود ندارد و به جای آن باید فایل .gitignore را به صورت دستی ویرایش کرد و فایل های مورد نظر را به آن اضافه کرد. فایل .gitignore شامل الگو هایی است که نسبت به فایل های موجود در مخزن بررسی می شود تا مشخص کند که فایلی باید ignore بشود یا خیر.

الگو های ignore کردن در گیت

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

توضیح

نمونه

الگو ها

شما می توانید قبل از هر الگو ** قرار دهید تا شامل تمام پوشه های موجود در مخزن بشود.

logs/debug.log
logs/monday/foo.bar
build/logs/debug.log

**/logs

از ** برای تطابق نام فایل ها و پوشه ای که در آن قرار دارند نیز می توان استفاده کرد.

logs/debug.log
build/logs/debug.log
با نمونه ی زیر مطابق نیست:
logs/build/debug.log

**/logs/debug.log

* به معنی تعداد صفر یا بیشتر کاراکتر است.

debug.log
foo.log
.log
logs/debug.log

*.log

قراردادن علامت تعجب قبل از هر الگویی آن را نفی می کند. اگر فایلی با یکی از الگو ها مطابقت داشته باشد اما همچنین با یک الگوی دارای علامت تعجب هم تطبیق پیدا کند، آن فایل ignore نخواهد شد.

debug.log
trace.log
با نمونه های زیر مطابق نیست:
important.log
logs/important.log

*.log
!important.log

الگو های تعریف شده بعد از الگو های نفی (دارای علامت تعجب) تمام الگوهای نفی قبل از خود را نادیده می گیرند.

debug.log
important/trace.log
با نمونه زیر مطابق نیست:
important/debug.log

*.log
!important/*.log
trace.*

قرار دادن / قبل از الگو باعث می شود تنها فایل هایی که در root پوشه هستند مطابق باشند.

debug.log
با نمونه زیر مطابق نیست:
logs/debug.log

/debug.log

به طور پیش فرض الگو ها با فایل هایی در هر پوشه مطابق می شوند.

debug.log
logs/debug.log

debug.log

علامت سوال با تنها یک کاراکتر مطابقت پیدا می کند.

debug0.log
debugg.log
با نمونه زیر مطابق نیست:
debug10.log

debug?.log

کروشه برای تطبیق دادن یک کاراکتر در بازه ای مشخص استفاده می شود.

debug0.log
debug1.log
با نمونه زیر مطابق نیست:
debug10.log

debug[0-9].log

کروشه تنها با یک کاراکتر از بازه ی داده شده مطابق می شود.

debug0.log
debug1.log
با نمونه های زیر مطابق نیست:
debug2.log
debug01.log

debug[01].log

علامت تعجب می تواند برای تطبیق دادن هر کاراکتری به جز یکی از کاراکتر های بازه داده شده استفاده شود.

debug2.log
با نمونه های زیر مطابق نیست:
debug0.log
debug1.log
debug01.log

debug[!01].log

بازه ها می توانند عددی یا حرفی باشند.

debuga.log
debugb.log
با نمونه زیر مطابق نیست:
debug1.log

debug[a-z].log

اگر / قبل از الگو ننویسید، الگو، پوشه ها و فایل های هم نام آن را تطبیق می دهد. در نمونه آورده شده پوشه ها و فایل هایی به نام logs نادیده گرفته خواهند شد.

logs
logs/debug.log
logs/latest/foo.bar
build/logs
build/logs/debug.log

logs

قرار دادن / در انتهای الگو مشخص می کند که الگو، یک پوشه است. تمام محتوای هر پوشه ای در مخزن که با الگو مطابقت داشته باشد - شامل  تمام فایل ها و پوشه ها – نادیده گرفته خواهند شد.

logs/debug.log
logs/latest/foo.bar
build/logs/foo.bar
build/logs/latest/debug.log

logs/

به طور معمول انتظار می رفت

logs/important.log

در نمونه ی گفته شده نادیده گرفته نشود. (به دلیل وجود الگوی نفی).

اما به دلایل مربوط به بهره وری در گیت، الگو های نفی نمی توانند فایل ها یا پوشه هایی که توسط الگوی مخصوص پوشه مطابقت پیدا کردند را نفی کنند.

logs/debug.log
logs/important.log

logs/
!logs/important.log

** با تعداد صفر یا بیشتر پوشه مطابق می شود.

logs/debug.log
logs/monday/debug.log
logs/monday/pm/debug.log

logs/**/debug.log

* در نام پوشه ها هم می تواند استفاده شود.

logs/monday/debug.log
logs/tuesday/debug.log
با نمونه زیر مطابق نیست:
logs/latest/debug.log

logs/*day/debug.log

الگو هایی که فایلی در یک پوشه ی خاص را مشخص می کنند نسبت به root مخزن تطبیق داده می شوند. (شما می توانید / را قبل از نام پوشه قرار دهید اما نتیجه یکسانی حاصل خواهد شد).

logs/debug.log
با نمونه های  زیر مطابق نیست:
debug.log
build/logs/debug.log

logs/debug.log

موارد گفته شده در جدول بالا با این فرض مطرح شدند که فایل .gitignore شما در root مخزن قرار دارد. اگر مخزن شما چندین فایل .gitignore دارد پیشنهاد می شود که آن را با یک فایل جایگزین کنید تا اعضای تیم اذیت نشوند.

افزون بر کاراکتر های گفته شده در بالا، شما می توانید از # استفاده کنید تا یک خط را در فایل .gitignore کامنت کنید.

# ignore all logs *.log 

اگر فایل یا پوشه ای دارید که نام آن شامل یکی از کاراکتر های معرفی شده در جدول بالا است، می توانید قبل از آن \ قرار داده تا به گیت بفهمانید که منظور شما نشانه ی الگو نیست و دقیقا همان کاراکتر مد نظر شما است.

foo\[01\].txt 

که این یعنی تنها فایل  foo\[01\].txt را نادیده بگیر.

فایل های .gitignore به اشتراک گذاشته شده در مخزن شما

قوانین نادیده گرفتن در گیت، معمولا در یک فایل .gitignore در root مخزن شما تعریف می شود. البته شما می توانید چندین فایل .gitignore در پوشه های مختلف داشته باشید. هر الگو در فایل .gitignore نسبت به مسیری که در آن قرار دارد عمل می کند. بهتر است تنها یک فایل .gitignore در کل پروژه داشته باشید. پس از اینکه فایل .gitignore شما  Commit شد مانند هر فایل دیگری نسخه گذاری می شود و پس از push کردن، بین هم تیمی های شما قابل استفاده است. به طور معمول شما باید الگو هایی را در .gitignore قرار دهید که بدانید هم تیمی های شما از آن استفاده خواهند کرد و کار آن ها را دچار اختلال نمی کند.

قوانین شخصی برای نادیده گرفتن در گیت

شما می توانید الگو هایی را برای نادیده گرفتن فایل ها در تمام مخزن های local خود تعریف کنید. برای این کار باید ویژگی core.excludesFile گیت را با دادن آدرس یک فایل .gitignore تنظیم کنید. اگر مطمئن نیستید که فایل .gitignore عمومی را کجا قرار دهید مسیر Home سیستم عامل شما می تواند پیشنهاد خوبی باشد (پیدا کردن آن در آینده راحت تر است). پس از ایجاد فایل، باید محل آن را در گیت پیکربندی کنید.

git config --global core.excludesFile ~/.gitignore

باید مواظب الگو هایی که برای نادیده گرفته شدن فایل ها به صورت عمومی انتخاب می کنید باشید. چرا که هر پروژه ممکن است قوانین خاص خودش را داشته باشد. فایل های تولید شده توسط سیستم عامل و IDE معمولا گزینه ی مناسبی برای نادیده گرفتن به صورت عمومی اند.

ignore کردن فایلی که در گذشته Commit شده است

اگر می خواهید فایلی که در گذشته Commit کرده اید را ignore کنید، باید فایل را از مخزن خود پاک کرده و یک قانون در .gitignore برای آن بنویسید. استفاده از گزینه ی –cached با دستور git rm به این معنی است که فایل از مخزن شما پاک می شود اما به عنوان یک فایل نادیده گرفته شده در پوشه شما باقی می ماند.

echo debug.log >> .gitignore 

git rm --cached debug.log

git commit -m "Start ignoring debug.log"

در صورتی که می خواهید فایل مورد نظر از مخزن و حافظه سیستم شما پاک شود، می توانید گزینه ی –cached را استفاده نکنید.

Commit کردن فایل ignore شده

این امکان وجود دارد که یک فایل ignore شده را در مخزن Commit کنید. برای این کار باید از گزینه ی -f یا –force در دستور git add استفاده کنید.

cat .gitignore *.log 

git add -f debug.log 

git commit -m "Force adding debug.log"

برای نمونه، شما می توانید از این قابلیت هنگامی که یک الگوی کلی روی فایل هایی با پسوند .log دارید اما می خواهید یک فایل خاص با این پسوند Commit شود، استفاده کنید. البته یک راه بهتر برای این شرایط این است که یک استثنا تعریف کنید.

echo !debug.log >> .gitignore 

cat .gitignore *.log !debug.log 

git add debug.log 

git commit -m "Adding debug.log" 

این روش واضح تر است و باعث گیج شدن هم تیمی های شما نمی شود.

stash کردن یک فایل ignore شده

دستور git stash یک قابلیت قدرتمند در گیت برای برگرداندن موقت تغییرات local است که امکان اعمال مجدد تغییر ها را در آینده به شما می دهد. همان طور که انتظار می رود به طور پیش فرض git stash فایل های ignore شده را نادیده می گیرد و تنها تغییراتی که گیت دنبال می کند را stash می کند. البته شما می توانید با استفاده از گزینه ی –all تغییرات فایل های ignore شده و دنبال نشده را هم stash کنید.

عیب یابی فایل های .gitignore

اگر الگو های پیچیده ای در فایل .gitignore دارید یا الگو های متفاوتی را در چندین فایل .gitignore قرار داده اید، فهمیدن این که چرا یک فایل ignore شده است، می تواند کار سختی باشد. شما می توانید از دستور git check-ignore با گزینه ی -v یا –verbose استفاده کنید تا مشخص شود کدام الگو باعث ignore شدن یک فایل خاص شده است.

git check-ignore -v debug.log .gitignore:3:*.log debug.log
online-support-icon