بعد از حدود ۲۵ سال برنامه‌نویسی و بازنویسی کامل پروژه های بزرگی مثل «توسینسو» (که حداقل ۵ بار این کار رو کردیم)، اگر یک چیز باشد که بتوانم روی آن قسم بخورم، «اهمیت مدیریت سورس‌کد» است.

شاید فکر کنید گیت (Git) فقط برای این است که کدهایتان را جایی ذخیره کنید. اما واقعیت این است که مدیریت سورس‌کد، یک هنر است؛ هنرِ تمیز نگه داشتن تاریخچه پروژه. و در این هنر، مهم‌ترین و در عین حال فراموش‌شده‌ترین ابزار شما، فایلی به نام .gitignore است.

نیازی به گفتن نیست که تقریباً هر برنامه‌نویس تازه‌کاری (و متاسفانه حتی برخی باتجربه‌ها) این اشتباه را مرتکب می‌شوند: راست کلیک روی پوشه پروژه و git add .. این کار، مثل این است که برای اسباب‌کشی، به جای بسته‌بندی وسایل، کل خانه را با تمام نخاله‌های ساختمانی و زباله‌ها، یکجا بار کامیون کنید!

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

.gitignore دقیقاً چیست؟

قبل از هر چیز، بیایید ببینیم این فایل اصلاً چیست.

بر اساس مستندات رسمی Git، یک فایل .gitignore مشخص می‌کند که کدام فایل‌ها یا پوشه‌هایی که ردیابی نشده‌اند (untracked) باید توسط Git نادیده گرفته شوند. فایل‌هایی که از قبل توسط Git ردیابی می‌شوند، تحت تأثیر این فایل قرار نمی‌گیرند. منبع

به زبان ساده، شما لیستی از فایل‌ها و پوشه‌ها را به گیت می‌دهید و می‌گویید: «لطفاً این موارد را اصلاً نبین و در git status به من نشان نده.»

چرا این فایل برای پروژه‌های دات نت «حیاتی» است؟

وقتی شما یک پروژه دات نت را build یا run می‌کنید، کامپایلر دات نت (Roslyn) شروع به کار می‌کند. این فرایند، حجم زیادی فایل «موقت» و «خروجی» تولید می‌کند.

مهم‌ترین این پوشه‌ها عبارتند از:

  1. پوشه bin (Binary): اینجاست که خروجی نهایی کامپایل شده شما قرار می‌گیرد (فایل‌های .dll و .exe). این فایل‌ها در هر بار بیلد تغییر می‌کنند و حجم بالایی دارند. قرار گرفتن آن‌ها در سورس کنترل یک فاجعه است.
  2. پوشه obj (Object): این پوشه حاوی فایل‌های میانی است که کامپایلر برای ساختن فایل‌های نهایی bin از آن‌ها استفاده می‌کند. این‌ها هم فایل‌های موقت و کاملاً غیرضروری برای سورس کنترل هستند.
  3. فایل‌های کاربر خاص (User-specific): فایل‌هایی مثل .suo (Solution User Options) یا پوشه .vs حاوی تنظیمات شخصی شما در ویژوال استودیو (مثلاً کدام فایل‌ها را باز کرده‌اید) هستند. اگر این فایل‌ها به سورس کنترل اضافه شوند، تنظیمات شما با تنظیمات هم‌تیمی‌هایتان تداخل پیدا می‌کند.

دلیل اصلی: هدف از سورس کنترل، ذخیره «سورس» کد است؛ یعنی فایل‌هایی که «انسان» نوشته (مثل .cs.csproj.sln). فایل‌هایی که «ماشین» می‌سازد (مثل bin و obj) نباید هرگز، تاکید می‌کنم هرگز، در سورس کنترل قرار بگیرند.

چطور یک فایل .gitignore حرفه‌ای بسازیم؟

سه راه اصلی برای این کار وجود دارد که از ساده به حرفه‌ای آن‌ها را بررسی می‌کنیم.

روش اول: ساخت دستی (برای درک مفهوم)

شما می‌توانید به سادگی یک فایل متنی در ریشه (Root) پروژه خود (کنار فایل .sln) به نام .gitignore بسازید.

نکته ویندوزی: ویندوز به شما اجازه نمی‌دهد فایلی بسازید که با نقطه شروع شود. برای این کار، فایل را به نام gitignore. (با یک نقطه در انتها) ذخیره کنید، ویندوز خودکار آن نقطه را حذف می‌کند و فایل .gitignore ساخته می‌شود. یا از طریق ترمینال با دستور echo "" > .gitignore آن را بسازید.

سپس محتوای زیر را داخل آن کپی کنید (این یک نسخه حداقلی است):

# Build artifacts
[Bb]in/
[Oo]bj/

# User-specific files
*.suo
.vs/
*.user

روش دوم: استفاده از ابزارهای مایکروسافت (راه آسان)

خوشبختانه، مایکروسافت این کار را برای ما ساده کرده است.

۱. در زمان ساخت پروژه در ویژوال استودیو: وقتی در حال ساخت یک پروژه جدید هستید، در پنجره آخر، گزینه‌ای به نام «Add to Git» (در نسخه‌های قدیمی‌تر) یا در بخشی از فرآیند، گزینه ایجاد مخزن Git وجود دارد. اگر این گزینه را فعال کنید، ویژوال استودیو به‌صورت خودکار یک فایل .gitignore استاندارد و عالی برای شما می‌سازد.

۲. استفاده از .NET CLI: اگر مثل من طرفدار خط فرمان هستید، می‌توانید به سادگی با یک دستور این فایل را اضافه کنید. کافی است در ترمینال به پوشه Solution خود بروید و دستور زیر را وارد کنید:

dotnet new gitignore

این دستور، یک فایل .gitignore استاندارد و به‌روز شده توسط مایکروسافت را در همان پوشه ایجاد می‌کند.

روش سوم: استفاده از الگوهای GitHub (راه حرفه‌ای و توصیه‌شده)

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

الگوی مخصوص ویژوال استودیو (که پروژه‌های دات نت را کامل پوشش می‌دهد) بسیار جامع است.

این همان فایلی است که ما در توسینسو استفاده می‌کنیم و توصیه می‌کنم شما هم از آن استفاده کنید. کافی است یک فایل .gitignore بسازید و محتوای زیر را در آن کپی کنید:

# This file is based on the official VisualStudio.gitignore template from GitHub

## Global Visual Studio
## Covers .NET Core, .NET Framework, and other project types

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa]rm/
[Aa]rm64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Other VS files
.vs/
TestResults/
*.VC.db
*.pdb
*.ipch

# Other common ignores
*.Cache
*.bak
*.ncb
*~

# Rider specific
.idea/

# Mac specific
.DS_Store

# ... (and many other specific cases covered by the full template)

(توجه: این یک نسخه خلاصه‌شده است. همیشه نسخه کامل را از مخزن گیت‌هاب دریافت کنید.)

یک اشتباه رایج: «اگر قبلاً فایل‌های bin را Commit کرده باشم چطور؟»

این سوالی است که زیاد پیش می‌آید. شما .gitignore را اضافه می‌کنید اما می‌بینید هنوز آن فایل‌ها در git status نمایش داده می‌شوند یا حذف نمی‌شوند.

دلیل: .gitignore فقط روی فایل‌های Untracked (ردیابی‌نشده) کار می‌کند. اگر شما قبلاً (به اشتباه) پوشه bin را add و commit کرده باشید، گیت دیگر آن را نادیده نمی‌گیرد چون آن فایل رسماً جزئی از تاریخچه پروژه شده است.

راه‌حل: شما باید به گیت بگویید که ردیابی این فایل‌ها را متوقف کند (ولی آن‌ها را از سیستم خودتان حذف نکند).

  1. ابتدا فایل .gitignore خود را کامل و تصحیح کنید.
  2. آن را add و commit کنید.
  3. سپس، دستورات زیر را اجرا کنید تا کش (Cache) گیت پاک شود و فایل‌های نادیده‌گرفته شده از ردیابی خارج شوند:
# Remove everything from the Git index
git rm -r --cached .

# Add everything back, respecting the new .gitignore
git add .

# Commit the changes
git commit -m "Cleaned up repository based on .gitignore"

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

نتیجه‌گیری

همانطور که در پروژه توسینسو بارها برایمان ثابت شده، داشتن یک کدبیس تمیز، فقط به نوشتن کد تمیز خلاصه نمی‌شود؛ به «مدیریت» تمیز آن کدبیس هم بستگی دارد. فایل .gitignore سنگ بنای این مدیریت تمیز است.

وقت گذاشتن برای تنظیم صحیح این فایل در ابتدای پروژه، شما را از ساعت‌ها سردرد، تداخل کد، و سنگین شدن بی‌دلیل مخزن (Repository) در آینده نجات می‌دهد. این کار را جدی بگیرید.