.gitattributes — تنظیم رفتار فایل‌ها

کنترل رفتار گیت نسبت به فایل‌ها: پایان خطوط، diff زبان‌ها و رفتار merge — با فایل .gitattributes.

.gitattributes چیست؟

فایل .gitattributes در ریشه مخزن، به گیت می‌گوید با هر نوع فایل چطور رفتار کند: پایان خطوط، نحوه نمایش diff، رفتار هنگام merge و...

مشکل کلاسیک: پایان خطوط (Line Endings)

ویندوز و لینوکس/مک درباره «پایان خط» اختلاف دارند:

سیستمکاراکترنام
ویندوزCRLFCarriage Return + Line Feed
لینوکس / مکLFLine Feed

نتیجه: همکار ویندوزی و لینوکسی روی یک فایل کار کنند، گیت هر خط را تغییرکرده می‌بیند — به‌همراه تعارض‌های بی‌دلیل!

راه‌حل با .gitattributes

# همه فایل‌های متنی خودکار نرمال‌سازی شوند:
* text=auto

# فایل‌های ویندوزی همیشه CRLF:
*.bat text eol=crlf

# فایل‌های لینوکسی همیشه LF:
*.sh text eol=lf

با * text=auto گیت در مخزن همیشه LF ذخیره می‌کند و در checkout بر اساس سیستم‌عامل تبدیل می‌کند — مشکل حل!

تنظیم سراسری (جایگزین)

# برای کاربر ویندوزی:
git config --global core.autocrlf true

# برای کاربر مک/لینوکسی:
git config --global core.autocrlf input
توصیه مدرن: .gitattributes در مخزن بهتر از تنظیم سراسری است — چون همه اعضای تیم را یکجا پوشش می‌دهد.

diff بهتر برای فایل‌های باینری

به‌صورت پیش‌فرض گیت نمی‌داند با فایل‌های باینری چه کند. با .gitattributes می‌توانید ابزارهای تخصصی معرفی کنید:

# diff تصاویر (با ابزار exiftool):
*.png diff=exif

# فایل‌های کاملاً باینری (بدون diff و merge):
*.zip binary
*.woff binary

رفتار merge سفارشی

# فایل‌های lock را خودکار merge نکن، نسخه جدید را نگه دار:
package-lock.json merge=ours

# استراتژی union برای فایل‌های فهرستی:
CHANGELOG.md merge=union

زبان‌شناسی diff (نمایش بهتر)

گیت برای پسوندهای شناخته‌شده (py، js و...) diff هوشمند دارد. برای پسوندهای خاص:

# فایل‌های .mylang مثل پایتون رفتار کنند:
*.mylang diff=python

مثال کامل .gitattributes

* text=auto eol=lf

*.sh text eol=lf
*.bat text eol=crlf

*.png binary
*.jpg binary
*.pdf binary

*.zip binary
*.tar.gz binary

package-lock.json merge=ours

نرمال‌سازی مخزن موجود

اگر بعداً .gitattributes اضافه کردید، فایل‌های موجود را نرمال کنید:

git add --renormalize .
git commit -m "نرمال‌سازی پایان خطوط"

خلاصه

این مبحث بخشی از دوره آموزش کامل Git است.

ابزارهای مرتبط