لو فريقك بيشتغل على repo Node.js وكل يوم في 2 أو 3 PRs بترجع من المراجعة بسبب trailing whitespace أو import مش مستخدم، إنت بتحرق وقت مراجعة في حاجات ميكانيكية المفروض الـ Editor يصلّحها. Pre-commit Hook بسطرين تركيب بيرفض الـ commit أصلاً لو الكود مش نضيف.
Pre-commit Hooks: حارس البوابة قبل ما الكود يدخل الـ history
المشكلة باختصار
تخيّل بوّاب البناية. شغلته الوحيدة إنه يتأكد إن اللي داخل ساكن أو زائر معروف. لو سيب أي حد يدخل من غير سؤال، الأمن كله بيتكسر. الـ Pre-commit Hook هو بوّاب الـ Git repo بتاعك. شغلته إنه يفحص الكود اللي بتحاول تـ commit، ولو لقى مشكلة يقفل الباب ويقولك "صلّح الأول، ارجع تاني".
اللي بيحصل فعلاً في معظم الفرق إن الفحوصات بتشتغل بعد الـ push على CI. الكود يوصل GitHub، الـ workflow يبدأ، ESLint يلاقي 3 أخطاء، CI يفشل بعد 4 دقايق، إنت ترجع تصلّح، تعمل commit جديد، تعيد الـ push. الدورة دي بتاخد 6 إلى 12 دقيقة كل مرة، وبتتكرر مرتين أو تلاتة في اليوم لكل مطوّر.
الفكرة الأساسية: كلما اكتشفت الخطأ مبكرًا، كلما كلّفك أقل. خطأ بيتمسك في الـ editor مجاني. خطأ بيتمسك في الـ commit بيكلّف 10 ثواني. خطأ بيتمسك في الـ CI بيكلّف 6 دقايق. خطأ بيوصل الإنتاج بيكلّف ساعات.
تعريف علمي دقيق: Git Hooks
حسب توثيق Git الرسمي (git-scm.com/docs/githooks)، الـ Git Hooks هي scripts قابلة للتنفيذ بيشغّلها Git تلقائيًا عند أحداث معيّنة في دورة حياة الـ repo. الملفات بتعيش في مجلد .git/hooks/ ولها أسماء محددة زي pre-commit, commit-msg, pre-push.
المشكلة في الـ hooks الافتراضية إن مجلد .git/ مش بيتعمله commit مع الكود، يعني الـ hook ما بيتشاركش بين أعضاء الفريق. Husky بيحل المشكلة دي بإنه ينقل الـ hooks لمجلد .husky/ اللي بيتعمله commit عادي، ويوصّل Git إنه يبص هناك بدل المكان الافتراضي عبر core.hooksPath.
lint-staged طبقة فوق Husky. بدل ما تشغّل ESLint على الـ codebase كله (اللي ممكن ياخد دقيقتين على مشروع متوسط)، lint-staged بيشغّل الفحوصات على الملفات اللي إنت عاملها stage فقط — يعني اللي ضيفتها بـ git add. النتيجة: زمن الفحص بينزل من دقيقتين لـ 1.8 ثانية في المتوسط.
خطوات التركيب — قابلة للنسخ على أي مشروع Node.js
الخطوات دي مختبرة على Node.js 20+ و npm 10، Husky 9.1، lint-staged 15.2. لو بتستخدم pnpm أو yarn، بدّل npm بأمر الـ package manager بتاعك.