Git 2026

فصل ۹ · gitignore و LFS

نادیده‌گرفتن و فایل بزرگ — gitignore، attributes، LFS

اگر فایل رمز (مثل .env) یک‌بار git add شود، حتی بعد از حذف از پوشه در تاریخچه می‌ماند. این فصل می‌گوید چه چیزی را از اول وارد Git نکنی و فایل بزرگ را کجا بگذاری.

🎯 اهداف یادگیری

  • .gitignore مؤثر بنویسی و الگوی negating را بفهمی
  • فایل trackشده را بعداً ignore کنی
  • Git LFS را برای باینری بزرگ راه بیندازی
  • .gitattributes را برای eol و diff تنظیم کنی

🚫 gitignore — الگوها

.gitignore — نمونهٔ Node/Python
# وابستگی
node_modules/
.venv/
dist/
coverage/

# راز
.env
.env.*
!.env.example

# سیستم
.DS_Store
Thumbs.db

# ادیتور — اختیاری: بعضی تیم‌ها .vscode را commit می‌کنند
.idea/

اولویت: الگوی محلی فایل → پوشهٔ والد → ریشه → .git/info/exclude → core.excludesFile جهانی.

چرا هنوز دیده می‌شود؟
git check-ignore -v src/.env     # کدام قانون خورد؟
git rm --cached secrets.json     # از Index بردار، فایل روی دیسک بماند
فایل trackشده ignore نمی‌شود

اگر قبلاً add شده، باید git rm --cached کنی. فقط نوشتن در gitignore کافی نیست.

در VS Code فایل‌های ignoreشده در Explorer کم‌رنگ‌اند. Source Control آن‌ها را نشان نمی‌دهد مگر Show Ignored.

🌍 قالب جهانی

excludes سراسری
git config --global core.excludesFile ~/.gitignore_global
echo ".DS_Store" >> ~/.gitignore_global

📦 Git LFS — باینری را در تاریخچه خفه نکن

PDF، مدل سه‌بعدی، وزن شبکهٔ عصبی و فیلم با هر ویرایش کل blob را تکرار می‌کنند.

LFS
git lfs install
git lfs track "*.pdf"
git lfs track "*.psd"
git add .gitattributes
git add docs/book.pdf
git commit -m "chore: store pdf in LFS"
git lfs ls-files

روی GitHub فضای LFS جداگانه دارد (سهمیه). برای کتاب و بازی رایج است؛ برای کد منبع لازم نیست.

🧩 gitattributes

.gitattributes
* text=auto eol=lf
*.sh text eol=lf
*.bat text eol=crlf
*.png binary
*.pdf filter=lfs diff=lfs merge=lfs -text
package-lock.json merge=binary   # جلوگیری از merge درهم JSON قفل

eol=lf جنگ CRLF ویندوز/لینوکس را در تیم‌های چندسیستمی می‌کشد. در VS Code "files.eol": "\n".

قالب github

فایل .gitattributes با linguist-vendored می‌تواند آمار زبان مخزن را درست کند — مفید برای monorepo.

سؤالات مصاحبه (با پاسخ)

Junior — node_modules را commit کنیم؟ هرگز. قفل (package-lock) را بله، پوشه را خیر.

Mid — تفاوت exclude و gitignore؟ info/exclude شخصی و غیرقابل‌پوش است؛ gitignore تیمی است.

Senior — LFS pointer چیست؟ فایل متنی کوچک با OID و اندازه که به‌جای باینری در Git ذخیره می‌شود؛ محتوا روی LFS store است.

✅ چک‌لیست فهم

  • .env در تاریخچه نیست
  • check-ignore -v را بلدی
  • برای PDF از LFS استفاده می‌کنی
  • eol تیم یکسان است

فصل بعد: Source Control در VS Code از صفر — میانبر Ctrl+Shift+G، با عکس نزدیک.

فصل ۹ از ۳۶ · مرجع جامع و حرفه‌ای Git و GitHub · ویرایش 1.0.0