מה הם Git Hooks ואיך הם עובדים?

Git Hooks הם סקריפטים שמתבצעים באופן אוטומטי בעת קורות מסוימים בתהליך הפיתוח — כמו לפני commit, אחרי push, או בזמן merge. הם נמצאים בתיקיית .git/hooks/ של כל מאגר Git, ומאפשרים לך להוסיף אוטומציה מלאה לתהליכי פיתוח.

הסקרים מופעלים על ידי Git עצמה — ללא צורך בהגדרות חיצוניות או שירותים נוספים. זה מביא ליעילות, אמינות וקלות ניטור. חשוב לדעת:_hooks_ אינם מתפרסמים עם המאגר — כלומר, כל מפתח חייב להתקין אותם ידנית או באמצעות סקריפט אוטומטי.

ℹ️ מידע חשוב: GitHooks נחלקים לשני סוגי עיקריים: Client-side (כמו pre-commit, commit-msg) ו-Server-side (כמו pre-receive, update). הסקריפטים שלנו יתמקדו בעיקר ב-Client-side — אלו הנפוצים והשימושיים ביותר עבור מפתחים.

התקנה וניהול פשוט של_hooks_ בעזרת husky

להתקין_hooks_ ידנית בכל פרויקט הוא לא פרקטי. לכן, נשתמש בכלי החזק husky — ספרייה שמאפשרת להגדיר_hooks_ כחלק מהקובץ package.json ולהתקין אותם אוטומטית כשאתה מריץ npm install.

# התקנת husky בגירסה 8+
npm install husky --save-dev

# הפעלת ההגדרות האוטומטיות
npx husky install

# יצירת hook מסוג pre-commit שיבצע npm test
npx husky add .husky/pre-commit "npm test"

לאחר ההתקנה, כל פעם שתעשה git commit, husky יריץ את הבדיקה האוטומטית — ואם היא נכשלת, ה-commit לא יעבור. זה מבטיח שהקוד שמגיע למאגר הוא תמיד בדוק ובריא.

דוגמאות מעשיות לסקריפטים שימושיים

הנה שלושה_hooks_ רלוונטיים שמשפרים משמעותית את זרימת העבודה:

1. pre-commit: בדיקת פורמט קוד עם Prettier

# .husky/pre-commit
#!/usr/bin/env sh
# בודק רק את הקבצים שנבחרו ל-commit
git status --porcelain | grep -E '^[AM]' | cut -d' ' -f3- | xargs -r npx prettier --write

2. commit-msg: אכיפת מבנה הודעת_COMMIT_

# .husky/commit-msg
#!/usr/bin/env sh
# דורש תבנית כמו: feat(auth): הוספת אימות דו-שלבי
if ! grep -qE '^(feat|fix|docs|style|refactor|test|chore)\([^)]+\): .{10,}' $1; then
  echo "❌ שגיאה: הודעה לא תקינה. השתמש בתבנית: 'feat(api): תיאור קצר'"
  exit 1
fi

3. post-checkout: סנכרון סביבת פיתוח לאחר החלפה של ענף

# .husky/post-checkout
#!/usr/bin/env sh
# מפעיל npm install אם עברנו לענף שונה
if [ "$3" = "1" ]; then
  echo "🔄 מתקין תלותים לאחר החלפת ענף..."
  npm install >/dev/null
fi

השוואה: Git Hooks מול כלים חיצוניים

למה לבחור_hooks_ במקום כלים כמו GitHub Actions או CI/CD? הנה השוואה מעשית:

מאפיין Git Hooks CI/CD (למשל GitHub Actions)
זמן הפעלה בעת כתיבה — עוד לפני שהקוד יוצא מהמחשב שלך לאחר ה-push — כבר בתוך המאגר
מהירות מיידית (אין תלות ברשת/שרת) תלוי בעריכת שרת, בדרך כלל 10–60 שניות
אמינות התלות במחשב האישי — אפשר להשבית אותו מרוכזת ומבוקרת בשרת
הטמעה פשוטה, מקומית, ללא הגדרות מורכבות דורשת קבצי YAML, הרשאות, ניטור
שימוש מומלץ בדיקות ראשוניות: פורמט, סינטקס, Unit Tests בדיקות מורכבות: E2E, אינטגרציה, פריסה
✅ טיפ מקצועי: השתמשו בשילוב! Git Hooks לקיזוז מהיר של באגים מוקדמים, ו-CI/CD לבדיקות מעמיקות. זה נותן את היתרונות של שני העולמות — מהירות + אמינות.

אבטחה ואימונים: איך למנוע נזקים

_hooks_ הם סקריפטים רגילים — אבל בגלל שהם רצים אוטומטית, יש לקחת בחשבון את האבטחה וההשפעה שלהם:

⚠️ אזהרה קריטית: אם ה-pre-commit שלך מריץ פעולת git add או משנה קבצים, ייתכן שתחבל את ה-commit הנוכחי. תמיד בדקו את התנהגות ה-hook על ענף ניסיוני לפני שתריצו אותו בפרודקשן!

אוסף כלים מומלצים להרחבה

כדי להפוך את המערכת שלכם למקצועית באמת — הנה כלים שמתאימים לשלב עם_hooks_:

🔍

lint-staged

בודק רק את הקבצים שבחרת ל-commit — לא את כל הפרויקט. חוסך זמן ומשאבים.

🧪

Jest + pre-commit

הרץ טסטים רק על קבצים שנשנו — תוך שימוש ב-Jest’s --findRelatedTests.

🔒

git-secrets

מניע שגיאות בפיצוץ סודות (API keys, סיסמאות) לתוך המאגר — כולל בדיקה אוטומטית.

לדוגמה, כאן איך משלבים lint-staged עם husky:

# package.json
"lint-staged": {
  "*.js": ["eslint --fix", "prettier --write"],
  "*.md": ["prettier --write"]
},
"husky": {
  "hooks": {
    "pre-commit": "lint-staged"
  }
}

✍️ נכתב ע"י יעקב בידני | Senior AI & Full-Stack Expert | bdnhost.net