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
}
قانون خروج
exit 0= همهچیز خوب → عملیات ادامه مییابد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/hooks/— نمونهها را فعال کنید pre-commitمحبوبترین: لینت و کنترل قبل از کامیت- برای تیم: Husky یا ابزار مشابه
این مبحث بخشی از دوره آموزش کامل Git است.