Git Hooks — اسکریپت‌های خودکار در رویدادها

اجرای خودکار اسکریپت‌ها قبل/بعد از کامیت، push و merge با هوک‌های گیت — از فرمت کد تا بلاک کامیت بد.

Hook چیست؟

هوک (قلاب) اسکریپتی است که گیت در رویدادهای خاص به‌صورت خودکار اجرا می‌کند — مثل «قبل از کامیت، این کار انجام شود». با هوک‌ها می‌توانید قوانین پروژه را اجباری کنید.

کجا هستند؟

هوک‌ها در پوشه مخفی مخزن شما:

ls .git/hooks/
# applypatch-msg.sample
# pre-commit.sample
# pre-push.sample
# ...

فایل‌های .sample نمونه‌اند و اجرا نمی‌شوند — برای فعال‌کردن یک هوک، نمونه را کپی کنید و پسوند .sample را بردارید.

هوک‌های مهم محلی

هوککی اجرا می‌شود؟کاربرد رایج
pre-commitقبل از ثبت کامیتلینت/فرمت کد، جلوگیری از کامیت بد ⭐
commit-msgبعد از نوشتن پیاماعتبارسنجی فرمت پیام
pre-pushقبل از pushاجرای تست‌ها
post-commitبعد از کامیتاطلاع‌رسانی/نوتیف
post-mergeبعد از merge/pullنصب خودکار وابستگی‌ها

مثال ۱: pre-commit — جلوگیری از کامیت فایل .env

# فایل .git/hooks/pre-commit بسازید:
#!/bin/sh

# اگر فایل .env در کامیت هست، جلوگیری کن:
if git diff --cached --name-only | grep -q "^\.env$"; then
    echo "❌ خطا: فایل .env را نمی‌توان کامیت کرد!"
    exit 1   # خروج غیرصفر = لغو کامیت
fi

exit 0

روی لینوکس/مک باید قابل‌اجرا باشد: chmod +x .git/hooks/pre-commit

مثال ۲: pre-commit — اجرای لینتر

#!/bin/sh
# اجرای eslint قبل از هر کامیت:
npm run lint
# اگر لینت شکست بخورد، exit 1 برمی‌گرداند و کامیت لغو می‌شود

مثال ۳: commit-msg — قالب پیام

#!/bin/sh
# پیام باید با "feat" یا "fix" شروع شود:
head -1 "$1" | grep -qE "^(feat|fix|docs|chore):" || {
    echo "❌ پیام باید با feat: یا fix: شروع شود"
    exit 1
}

قانون خروج

هوک‌های سمت سرور

هوک‌هایی مثل pre-receive روی سرور (گیت‌هاب/گیت‌لب) اجرا می‌شوند و برای همه pushها اعمال می‌شوند — قوانین سازمانی مثل «فقط پیام‌های استاندارد» یا «فقط merge به‌وسیله PR». در گیت‌هاب معمولاً به‌جایش از Branch Protection + Actions استفاده می‌شود.

مشکل: هوک‌ها share نمی‌شوند!

پوشه .git کامیت نمی‌شود، پس هوک‌ها فقط برای خودتان‌اند! راه‌حل تیمی رایج: ابزارهایی مثل Husky (پروژه‌های نود) که هوک‌ها را از داخل مخزن نصب می‌کنند.
# مثال Husky در پروژه npm:
npm install --save-dev husky
npx husky init
# حالا هوک‌ها در پوشه .husky مخزن هستند و با تیم share می‌شوند!

رد کردن موقت هوک

# کامیت بدون اجرای هوک‌ها (فقط وقتی می‌دانید چه می‌کنید!):
git commit --no-verify -m "کامیت اضطراری"

خلاصه

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

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