مقدمه

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

برخی از نمونه‌های رایج این فایل‌ها عبارتند از:

  • پوشه‌های حجیم وابستگی‌ها مانند node_modules در پروژه‌های جاوااسکریپت.
  • فایل‌های خروجی کامپایلرها مانند .class در جاوا یا فایل‌های باینری در C++.
  • فایل‌های لاگ (.log) که در هر بار اجرای برنامه تولید می‌شوند.
  • فایل‌های مربوط به تنظیمات محلی ویرایشگرها مانند پوشه .vscode یا .idea
  • فایل‌های حاوی اطلاعات حساس مانند کلیدهای API یا رمزهای عبور.

اضافه کردن این فایل‌ها به مخزن گیت نه تنها آن را بی‌جهت سنگین می‌کند، بلکه می‌تواند منجر به مشکلات امنیتی جدی شود. گیت برای حل این مشکل، مکانیزم ساده و قدرتمندی به نام فایل .gitignore را ارائه می‌دهد.

فایل .gitignore چیست؟

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

وقتی فایلی نادیده گرفته می‌شود، به این معنی است که در خروجی دستور git status به عنوان یک فایل untracked ظاهر نخواهد شد و با دستوراتی مانند git add به منطقه آماده‌سازی (Staging Area) اضافه نمی‌شود. نکته بسیار مهم این است که خود فایل .gitignore باید به ریپوزیتوری کامیت شود تا این قوانین برای تمام اعضای تیم اعمال گردد.

قواعد و الگوهای نوشتاری در .gitignore

نوشتن الگو در این فایل بسیار ساده و منعطف است. در ادامه با قواعد اصلی آن آشنا می‌شویم:

  • خطوط خالی و کامنت‌ها: خطوط خالی برای خوانایی بیشتر نادیده گرفته می‌شوند. خطوطی که با علامت # شروع شوند نیز به عنوان کامنت در نظر گرفته شده و پردازش نمی‌شوند.
  • نام فایل: نوشتن نام یک فایل مانند debug.log باعث نادیده گرفته شدن تمام فایل‌هایی با این نام در سرتاسر پروژه می‌شود.
  • پوشه‌ها: برای نادیده گرفتن یک پوشه و تمام محتویات آن، نام پوشه را با یک اسلش (/) در انتهای آن بنویسید، مانند build/.
  • الگوهای Wildcard:
    • علامت ستاره (*) با صفر یا چند کاراکتر مطابقت دارد. برای مثال، الگوی *.log تمام فایل‌هایی را که به .log ختم می‌شوند، نادیده می‌گیرد.
    • علامت سوال (?) دقیقاً با یک کاراکتر مطابقت دارد.
  • الگوهای منفی (استثناها): اگر می‌خواهید فایلی را از یک الگوی کلی مستثنی کنید، از علامت تعجب (!) در ابتدای آن استفاده کنید. برای مثال، اگر تمام فایل‌های .log را نادیده گرفته‌اید اما می‌خواهید important.log رهگیری شود، ابتدا *.log و سپس در خط بعد !important.log را می‌نویسید.
  • مسیرهای مشخص: اگر الگویی با / شروع شود، فقط از ریشه ریپوزیتوری مطابقت داده می‌شود. برای مثال، /TODO فایل TODO در ریشه را نادیده می‌گیرد اما فایل src/TODO را نه.

یک نمونه کاربردی

در اینجا یک نمونه از فایل .gitignore برای یک پروژه وب مدرن (مثلاً Node.js) آورده شده است. این ساختار نمایش کد، برای فایل‌های سورس در درس‌های آینده نیز استفاده خواهد شد.

Copy Icon .gitignore
# OS-generated files
.DS_Store
Thumbs.db

# Dependency directories
node_modules/
bower_components/

# Build output
dist/
build/
out/

# Log files
*.log
npm-debug.log*

# Environment variables
.env
.env.local
.env.production.local

# IDE configuration files
.vscode/
.idea/

اگر فایلی از قبل رهگیری شده باشد چه کنیم؟

یک نکته مهم: افزودن یک الگو به .gitignore، فایل‌هایی را که از قبل در ریپوزیتوری کامیت شده‌اند، تحت تاثیر قرار نمی‌دهد. .gitignore فقط از رهگیری فایل‌های جدید جلوگیری می‌کند.

اگر به اشتباه فایلی (مثلاً یک فایل .env حاوی اطلاعات حساس) را کامیت کرده‌اید، ابتدا باید آن را از رهگیری گیت خارج کنید. برای این کار، از دستور git rm --cached استفاده کنید. این دستور فایل را از Staging Area و ریپوزیتوری حذف می‌کند اما آن را در پوشه کاری (working directory) باقی می‌گذارد.

git rm --cached .env

پس از اجرای این دستور، الگوی .env را به فایل .gitignore خود اضافه کرده و سپس تغییرات (حذف فایل از رهگیری و افزودن فایل .gitignore) را کامیت کنید.