.gitattributes — تنظیم رفتار فایلها
کنترل رفتار گیت نسبت به فایلها: پایان خطوط، diff زبانها و رفتار merge — با فایل .gitattributes.
.gitattributes چیست؟
فایل .gitattributes در ریشه مخزن، به گیت میگوید با هر نوع فایل چطور رفتار کند: پایان خطوط، نحوه نمایش diff، رفتار هنگام merge و...
مشکل کلاسیک: پایان خطوط (Line Endings)
ویندوز و لینوکس/مک درباره «پایان خط» اختلاف دارند:
| سیستم | کاراکتر | نام |
|---|---|---|
| ویندوز | CRLF | Carriage Return + Line Feed |
| لینوکس / مک | LF | Line 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
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 "نرمالسازی پایان خطوط"
خلاصه
- .gitattributes رفتار گیت با هر نوع فایل را تعیین میکند
- مهمترین کاربرد: یکسانسازی پایان خطوط بین ویندوز و لینوکس
* text=auto+eol= پایان خطوط همیشه درست- فایلهای باینری را با
binaryعلامت بزنید
این مبحث بخشی از دوره آموزش کامل Git است.