هوکهای گیت - بهترین شیوههای سطح سازمانی (Enterprise)
Git Hook چیست؟
هوکهای گیت اسکریپتهایی هستند که هنگام اجرای عملیات مختلف Git مانند commit، push، merge، checkout و ... به صورت خودکار اجرا میشوند. در پروژههای سازمانی (Enterprise)، استفاده از آنها ضروری است.
چرا تیمهای بزرگ از هوک استفاده میکنند؟
- جلوگیری از ورود کد بیکیفیت به مخزن
- خودکارسازی وظایف تکراری
- اجباری کردن فرمت پیام Commit
- جلوگیری از آپلود اشتباهی اطلاعات حساس
- اجرای تستها قبل از push یا merge
- هماهنگی با CI/CD و امنیت
- ایجاد هماهنگی بین تیمها و واحدهای سازمان
تفاوت هوکهای محلی و سروری
| هوک محلی | هوک سمت سرور |
|---|---|
| روی سیستم توسعهدهنده اجرا میشود | روی سرور مرکزی Git اجرا میشود |
| برای lint، format، validation مناسب است | برای CI/CD و سیاستهای امنیتی ضروری است |
| به صورت خودکار به اشتراک گذاشته نمیشود | برای همه اعضای تیم مشترک است |
| نیازمند ابزار versioning مثل Husky | بدون ابزار خارجی نسخهبندی میشود |
چطور Git Hook را فعال کنیم؟
هوکها داخل مسیر .git/hooks قرار دارند.
- به مسیر
.git/hooksبروید - فایل نمونه را rename کنید (
pre-commit.sample→pre-commit) - فایل را اجرایی کنید:
chmod +x pre-commit - کد اسکریپت را داخل آن بنویسید
نمونه ساده:
#!/bin/sh echo "Pre-commit اجرا شد..."
ابزارهای مدرن مدیریت هوکها
- Husky – بهترین برای تیمهای JavaScript
- Lefthook – بهترین برای تیمهای چندزبانه
- pre-commit – محبوب برای Python
- Overcommit – مناسب برای Ruby
فهرست کامل تمام هوکهای Git + توضیح سازمانی
| هوک | زمان اجرا | کاربرد | نکات حرفهای |
|---|---|---|---|
| pre-commit | قبل از commit | Lint, Format, امنیت | سریع باشد |
| prepare-commit-msg | قبل از باز شدن ویرایشگر | درج شماره تیکت | ضروری در Jira/DevOps |
| commit-msg | بعد از نوشتن پیام | اعتبارسنجی پیام | خطا → توقف commit |
| post-commit | بعد از commit | ثبت، اعلان | غیرمسدودکننده |
| pre-push | قبل از push | تستها، جلوگیری از push روی main | مناسب کارهای سنگین |
| pre-rebase | قبل از rebase | کنترل شاخهها | حیاتی |
| post-rewrite | بعد از rebase | آپدیت لاگ | |
| post-merge | بعد از merge | Install، Build | عالی برای monorepo |
| post-checkout | بعد از checkout | لود تنظیمات | |
| pre-receive | سروری | امنیت و سیاستها | سازمانی |
| post-receive | سروری | CI/CD | DevOps |
| update | سروری | اعتبارسنجی refs | |
| fsmonitor-watchman | افزایش سرعت | بهبود کارایی | پروژههای خیلی بزرگ |
| pre-auto-gc | قبل از GC | پاکسازی |
اشتباهات رایج توسعهدهندگان
- کند بودن هوکها → توسعهدهنده آن را غیرفعال میکند
- نسخهبندی نکردن → عدم هماهنگی بین تیم
- کد وابسته به سیستمعامل (ویندوز/لینوکس)
- Hardcode مسیرها
- عدم ثبت خروجی خطا
- قرار دادن وظایف CI داخل هوکها
- اسکن کردن کل پروژه بهجای فایلهای staged
بهترین شیوههای سازمانی
- هوکها باید سریع باشند
- نسخهبندی با Husky/Lefthook
- خطا →
exit 1 - استفاده از pre-commit برای کیفیت کد
- استفاده از pre-push برای تستها
- استفاده از commit-msg برای استاندارد Commit
- ثبت لاگها برای سیستمهای سازمانی
- استفاده از اسکریپتهای Cross-platform
- مستندسازی دقیق تمامی هوکها
- تکیه نکردن صرفاً به هوکها؛ CI ضروری است
نمونههای واقعی هوکها
۱) pre-commit (بررسی Lint + جلوگیری از Secrets)
#!/bin/sh files=$(git diff --cached --name-only --diff-filter=ACM) echo "اجرای ESLint..." npx eslint $files || exit 1 if grep -R "AWS_SECRET" $files ; then echo "Secret یافت شد! Commit مسدود شد." exit 1 fi
۲) commit-msg (اعتبارسنجی پیام Conventional Commit)
#!/bin/sh
msg=$(cat $1)
pattern='^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .+'
echo $msg | grep -Eq "$pattern" || {
echo "فرمت پیام معتبر نیست!"
exit 1
}