Git hooks: pre-commit va Husky bilan tekshiruvlarni avtomatlashtirish
Chuqur3 daqInnovialabs tahririyati
Qisqacha
Git hooks — Git commit yoki push dan oldin ishga tushiradigan skriptlar; pre-commit (Python) va Husky bilan lint-staged (JS) ularni butun jamoa uchun umumiy qiladi va faqat o‘zgargan fayllarni tekshiradi.
Qisqa javob
Git hooks — Git ma’lum paytlarda o‘zi ishga tushiradigan skriptlar: commit dan oldin, commit xabari yozilganda, push dan oldin. Skript xato bilan tugasa, amal bekor qilinadi.
«Yalang‘och» hook larning muammosi: ular .git/hooks da turadi, bu papka esa repozitoriyga kirmaydi. Shuning uchun sozlamalarni kodda saqlaydigan va hook larni har bir dasturchiga o‘rnatadigan vositalardan foydalaniladi:
- pre-commit — istalgan til bilan ishlaydigan Python freymvorki, Python loyihalarida mashhur.
- Husky + lint-staged — JavaScript va TypeScript loyihalaridagi standart juftlik.
Qaysi klient hook lari foydali
| Hook | Qachon ishlaydi | Odatda nima tekshiriladi |
|---|---|---|
pre-commit | commit yaratilishidan oldin | linter, formatlash, koddagi maxfiy ma’lumotlar |
commit-msg | xabar kiritilgandan keyin | commit xabari formati |
pre-push | serverga yuborishdan oldin | tez testlar, turlarni tekshirish |
Asosiy tamoyil: hook tez ishlashi kerak. Commit bir daqiqa kutsa, dasturchilar tekshiruvlarni chetlab o‘ta boshlaydi.
Python: pre-commit freymvorki
Paketni o‘rnating va loyiha ildizida .pre-commit-config.yaml faylini yarating:
default_install_hook_types: [pre-commit, commit-msg]
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.6.9
hooks:
- id: ruff
args: [--fix]
- id: ruff-format
- repo: https://github.com/compilerla/conventional-pre-commit
rev: v3.4.0
hooks:
- id: conventional-pre-commit
stages: [commit-msg]
Keyin:
pip install pre-commit
pre-commit install # hook larni .git/hooks ga o‘rnatadi
pre-commit run --all-files # butun loyiha bo‘yicha birinchi tekshiruv
pre-commit autoupdate # rev dagi versiyalarni yangilaydi
Nimani bilish muhim:
- Har bir hook o‘zining izolyatsiyalangan muhitida ishlaydi, versiyalar
revda qayd etilgan — butun jamoada natijalar bir xil. - Odatiy holatda faqat commit dagi fayllar tekshiriladi.
- Bu yerda
ruffham linting, ham formatlashni qamraydi;black,isort,mypyva boshqalarni ulash mumkin.
JavaScript: Husky va lint-staged
Husky hook larni boshqaradi, lint-staged esa buyruqlarni faqat indeksga qo‘shilgan fayllar uchun ishga tushiradi.
npm install --save-dev husky lint-staged
npx husky init
husky init buyrug‘i .husky papkasini yaratadi va prepare skriptini qo‘shadi — shunda hook lar npm install dan keyin avtomatik o‘rnatiladi. .husky/pre-commit ichidagini quyidagiga almashtiring:
npx lint-staged
package.json dagi lint-staged sozlamasi:
{
"lint-staged": {
"*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"],
"*.{css,md,json}": "prettier --write"
}
}
Commit xabarlarini commitlint orqali tekshirish:
npm install --save-dev @commitlint/cli @commitlint/config-conventional
echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js
echo 'npx --no -- commitlint --edit "$1"' > .husky/commit-msg
Endi fix: chegirma hisobini tuzatish kabi xabar o‘tadi, tuzatishlar esa o‘tmaydi. commitlint konfiguratsiyasi formati loyiha ES-modullardan foydalanishiga bog‘liq; o‘z versiyangiz hujjatlari bilan solishtiring.
Hook lar CI o‘rnini bosmaydi
Har qanday hook ni git commit --no-verify bayrog‘i bilan o‘tkazib yuborish mumkin, yangi dasturchida esa ular umuman o‘rnatilmagan bo‘lishi mumkin. Shuning uchun:
- xuddi shu tekshiruvlar CI da takrorlanadi — bu oxirgi himoya chizig‘i;
- hook lar push dan oldingi tezkor fikr-mulohaza, kafolat emas;
- og‘ir tekshiruvlarni (to‘liq testlar to‘plami, build) CI yoki
pre-pushda qoldiring.
Ko‘p uchraydigan xatolar
- Har bir commit da linterni butun loyiha bo‘yicha ishga tushirish — sekin. Faqat o‘zgargan fayllarni tekshiring.
- Vositalar versiyalarini qayd etmaslik — har xil odamlarda har xil natijalar.
- Eski loyihada qat’iy qoidalarni birdaniga yoqish — yuzlab xatolar va hook lar o‘chirib qo‘yiladi. Formatlashdan boshlang, qoidalarni asta-sekin qo‘shing.
- Windows ni unutish: hook skriptlari Git Bash da ishlashi kerak, platformaga xos buyruqlardan qoching.