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 |
از ** برای تطابق نام فایل ها و پوشه ای که در آن قرار دارند نیز می توان استفاده کرد. | logs/debug.log | **/logs/debug.log |
* به معنی تعداد صفر یا بیشتر کاراکتر است. | debug.log | *.log |
قراردادن علامت تعجب قبل از هر الگویی آن را نفی می کند. اگر فایلی با یکی از الگو ها مطابقت داشته باشد اما همچنین با یک الگوی دارای علامت تعجب هم تطبیق پیدا کند، آن فایل ignore نخواهد شد. | debug.log | *.log |
الگو های تعریف شده بعد از الگو های نفی (دارای علامت تعجب) تمام الگوهای نفی قبل از خود را نادیده می گیرند. | debug.log | *.log |
قرار دادن / قبل از الگو باعث می شود تنها فایل هایی که در root پوشه هستند مطابق باشند. | debug.log | /debug.log |
به طور پیش فرض الگو ها با فایل هایی در هر پوشه مطابق می شوند. | debug.log | debug.log |
علامت سوال با تنها یک کاراکتر مطابقت پیدا می کند. | debug0.log | debug?.log |
کروشه برای تطبیق دادن یک کاراکتر در بازه ای مشخص استفاده می شود. | debug0.log | debug[0-9].log |
کروشه تنها با یک کاراکتر از بازه ی داده شده مطابق می شود. | debug0.log | debug[01].log |
علامت تعجب می تواند برای تطبیق دادن هر کاراکتری به جز یکی از کاراکتر های بازه داده شده استفاده شود. | debug2.log | debug[!01].log |
بازه ها می توانند عددی یا حرفی باشند. | debuga.log | debug[a-z].log |
اگر / قبل از الگو ننویسید، الگو، پوشه ها و فایل های هم نام آن را تطبیق می دهد. در نمونه آورده شده پوشه ها و فایل هایی به نام logs نادیده گرفته خواهند شد. | logs | logs |
قرار دادن / در انتهای الگو مشخص می کند که الگو، یک پوشه است. تمام محتوای هر پوشه ای در مخزن که با الگو مطابقت داشته باشد - شامل تمام فایل ها و پوشه ها – نادیده گرفته خواهند شد. | logs/debug.log | logs/ |
به طور معمول انتظار می رفت logs/important.log در نمونه ی گفته شده نادیده گرفته نشود. (به دلیل وجود الگوی نفی). اما به دلایل مربوط به بهره وری در گیت، الگو های نفی نمی توانند فایل ها یا پوشه هایی که توسط الگوی مخصوص پوشه مطابقت پیدا کردند را نفی کنند. | logs/debug.log | logs/ |
** با تعداد صفر یا بیشتر پوشه مطابق می شود. | logs/debug.log | logs/**/debug.log |
* در نام پوشه ها هم می تواند استفاده شود. | logs/monday/debug.log | logs/*day/debug.log |
الگو هایی که فایلی در یک پوشه ی خاص را مشخص می کنند نسبت به root مخزن تطبیق داده می شوند. (شما می توانید / را قبل از نام پوشه قرار دهید اما نتیجه یکسانی حاصل خواهد شد). | 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