Git Hooks — Git

Hook adalah script yang Git jalankan otomatis pada event tertentu — sebelum commit, sesudah push, dll. Cocok untuk enforce standar tim. Lokasi hook: .git/hooks/

Hook adalah script yang Git jalankan otomatis pada event tertentu — sebelum commit, sesudah push, dll. Cocok untuk enforce standar tim.

Lokasi hook: .git/hooks/ — semua file eksekutabel (tanpa ekstensi .sample) akan dipanggil.

.git/hooks/
  pre-commit.sample       ← rename ke "pre-commit" untuk aktifkan
  commit-msg.sample
  pre-push.sample
  ...

Client-side hooks (jalan di komputer developer):

Hook Kapan fire Use case
pre-commit sebelum commit dibuat lint, format, test cepat
prepare-commit-msg editor pesan terbuka template pesan
commit-msg setelah pesan ditulis validasi Conventional Commits
post-commit setelah commit selesai notifikasi
pre-push sebelum push test lengkap

Server-side hooks (jalan di remote):

Hook Kapan fire Use case
pre-receive push masuk sebelum diterima enforce kebijakan
update per-ref saat push cek per branch
post-receive push sudah diterima trigger deploy, webhook

Contoh pre-commit:

#!/bin/sh
# .git/hooks/pre-commit
echo "Running linter..."
npm run lint --silent || {
  echo "❌ Lint gagal. Perbaiki dulu."
  exit 1
}
echo "✓ Lint lulus"

Jangan lupa:

$ chmod +x .git/hooks/pre-commit

Validasi Conventional Commits dengan commit-msg:

#!/bin/sh
# menolak pesan selain: feat: / fix: / docs: / dll
pattern="^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .{1,72}
quot; if ! grep -qE "$pattern" "$1"; then echo "❌ Gunakan format: feat: deskripsi singkat" exit 1 fi

Masalah: .git/hooks/ tidak ikut commit (ada di dalam .git/). Tim tidak dapat hook-mu otomatis.

Solusi: Husky + lint-staged

Husky menyimpan hook di folder biasa (versioned), mengarahkan core.hooksPath ke sana.

$ npm install -D husky lint-staged
$ npx husky init
# membuat .husky/pre-commit

package.json:

{
  "lint-staged": {
    "*.{js,ts}": "eslint --fix",
    "*.{css,md}": "prettier --write"
  }
}

.husky/pre-commit:

npx lint-staged

lint-staged hanya melint file yang di-stage — pre-commit jadi <1 detik bukannya 30 detik.

Skip hook (darurat):

$ git commit --no-verify -m "hotfix"   # lewati pre-commit & commit-msg
$ git push --no-verify                 # lewati pre-push

Gunakan --no-verify sangat hemat. Kalau sering dipakai, berarti hook-mu terlalu ketat atau ada bug di sana.

Yang akan kamu pelajari