Asosiy kontentga o‘tish
Innovialabs

Git hooks: pre-commit va Husky bilan tekshiruvlarni avtomatlashtirish

Chuqur3 daq

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

HookQachon ishlaydiOdatda nima tekshiriladi
pre-commitcommit yaratilishidan oldinlinter, formatlash, koddagi maxfiy ma’lumotlar
commit-msgxabar kiritilgandan keyincommit xabari formati
pre-pushserverga yuborishdan oldintez 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 rev da qayd etilgan — butun jamoada natijalar bir xil.
  • Odatiy holatda faqat commit dagi fayllar tekshiriladi.
  • Bu yerda ruff ham linting, ham formatlashni qamraydi; black, isort, mypy va 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-push da 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.

Ko‘p beriladigan savollar

Ha, pre-commit freymvorki tilga bog‘liq emas va Node vositalarini ishga tushira oladi. Lekin JS loyihalarida Husky va lint-staged odatiyroq, chunki ular npm bog‘liqliklari bilan birga o‘rnatiladi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.