هوک‌های گیت - بهترین شیوه‌های سطح سازمانی (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 قرار دارند.

  1. به مسیر .git/hooks بروید
  2. فایل نمونه را rename کنید (pre-commit.samplepre-commit)
  3. فایل را اجرایی کنید: chmod +x pre-commit
  4. کد اسکریپت را داخل آن بنویسید

نمونه ساده:

#!/bin/sh
echo "Pre-commit اجرا شد..."

ابزارهای مدرن مدیریت هوک‌ها

  • Husky – بهترین برای تیم‌های JavaScript
  • Lefthook – بهترین برای تیم‌های چندزبانه
  • pre-commit – محبوب برای Python
  • Overcommit – مناسب برای Ruby

فهرست کامل تمام هوک‌های Git + توضیح سازمانی

هوکزمان اجراکاربردنکات حرفه‌ای
pre-commitقبل از commitLint, 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بعد از mergeInstall، Buildعالی برای monorepo
post-checkoutبعد از checkoutلود تنظیمات
pre-receiveسروریامنیت و سیاست‌هاسازمانی
post-receiveسروریCI/CDDevOps
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
}