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-verifysangat hemat. Kalau sering dipakai, berarti hook-mu terlalu ketat atau ada bug di sana.