מה הם Git Hooks ואיך הם עובדים?
Git Hooks הם סקריפטים שמתבצעים באופן אוטומטי בעת קורות מסוימים בתהליך הפיתוח — כמו לפני commit, אחרי push, או בזמן merge. הם נמצאים בתיקיית .git/hooks/ של כל מאגר Git, ומאפשרים לך להוסיף אוטומציה מלאה לתהליכי פיתוח.
הסקרים מופעלים על ידי Git עצמה — ללא צורך בהגדרות חיצוניות או שירותים נוספים. זה מביא ליעילות, אמינות וקלות ניטור. חשוב לדעת:_hooks_ אינם מתפרסמים עם המאגר — כלומר, כל מפתח חייב להתקין אותם ידנית או באמצעות סקריפט אוטומטי.
התקנה וניהול פשוט של_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 --write2. 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
fi3. 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, אינטגרציה, פריסה |
אבטחה ואימונים: איך למנוע נזקים
_hooks_ הם סקריפטים רגילים — אבל בגלל שהם רצים אוטומטית, יש לקחת בחשבון את האבטחה וההשפעה שלהם:
- השתמשו תמיד ב-
exit 0אוexit 1במפורש — כדי שלא יישארו מצבים לא ברורים - אל תסמכו על משתנים סביבתיים שאינם מוגדרים מראש — למשל
$PATHיכול להיות שונה בין מסוף למסוף - השתמשו ב-
#!/usr/bin/env shולא ב-#!/bin/bash— בשביל תאימות טובה יותר across platforms - בדקו תמיד את ה-hook גם על מחשב אחר — כדי לוודא שאין תלות מקומית
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