Belajar Git - Pengenalan dan Penjelasan Git Hooks & Automasi Lokal
Episode 19 of 21

Belajar Git - Pengenalan dan Penjelasan Git Hooks & Automasi Lokal

Automasi alur kerja lokal dengan Git hooks: pre-commit untuk linter dan formatter, commit-msg untuk validasi Conventional Commits, pre-push untuk unit test, serta framework Husky dan pre-commit untuk membagikannya ke seluruh tim.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

Di episode 18 kita mengelola repository majemuk. Di episode 19 ini kita membahas keandalan di titik yang paling sering diabaikan: tangan kalian sendiri. Git Hook adalah script yang berjalan otomatis pada momen tertentu dalam siklus git — dan episode ini menunjukkan cara menggunakannya sebagai quality gate lokal sebelum kode keluar dari laptop.

Bayangkan sebuah tim di mana setiap commit selalu lolos linter, setiap pesan commit mengikuti Conventional Commits, dan setiap push selalu melewati unit test. Bukan karena disiplin semata, melainkan karena otomasi — Git tidak akan membiarkan pelanggaran lolos. Inilah perbedaan antara tim yang rapi karena aturan tertulis dan tim yang rapi karena sistem.

Apa Itu Git Hook

Hook adalah script yang ditempatkan di direktori .git/hooks/ dan dijalankan git pada titik tertentu. Cek isi defaultnya:

Melihat hook bawaan
ls .git/hooks/

Isinya deretan contoh dengan akhiran .sample (pre-commit.sample, commit-msg.sample, pre-push.sample). Hapus akhiran .sample dan isi dengan script kalian, atau buat file baru tanpa akhiran.

Ada dua golongan hook:

  • Client-side hooks — jalan di mesin masing-masing developer (commit, merge, push).
  • Server-side hooks — jalan di remote server; kebanyakan kini ditangani fitur GitHub seperti Branch Protection Rules (episode 13) dan CI.

Fokus kita kali ini: client-side hooks pre-commit, commit-msg, dan pre-push.

pre-commit: Linter & Formatter

Hook pre-commit berjalan sebelum commit dibuat. Jika ia keluar dengan status non-zero, commit dibatalkan. Contoh untuk project TypeScript:

.git/hooks/pre-commit
#!/bin/sh
echo "Menjalankan linter dan formatter..."
bun run lint
if [ $? -ne 0 ]; then
  echo "Lint gagal. Commit dibatalkan."
  exit 1
fi

Jangan lupa chmod +x .git/hooks/pre-commit agar script bisa dieksekusi.

commit-msg: Validasi Conventional Commits

Hook commit-msg menerima path file pesan commit sebagai argumen pertama — sempurna untuk memvalidasi format pesan:

.git/hooks/commit-msg
#!/bin/sh
pattern='^(feat|fix|docs|refactor|chore|perf|test|build|ci|style)(\(.+\))?: .+'
if ! grep -qE "$pattern" "$1"; then
  echo "Pesan commit tidak mengikuti Conventional Commits."
  echo "Contoh: feat: tambah halaman login"
  exit 1
fi

Commit dengan pesan asdf langsung ditolak sebelum sempat masuk riwayat — persis disiplin yang kita bicarakan sejak episode 4.

pre-push: Unit Test

Hook pre-push berjalan setelah git push dipanggil tapi sebelum data dikirim ke remote. Ini gerbang terakhir:

.git/hooks/pre-push
#!/bin/sh
echo "Menjalankan unit test sebelum push..."
bun run test

Kode yang gagal test tidak akan pernah sampai ke origin — code review di GitHub (episode 11) jadi fokus pada logika, bukan pada hal yang seharusnya sudah dicek mesin.

Membagikan Hook ke Tim

Masalahnya: folder .git/ tidak ikut ter-clone. Hook yang ditulis di laptop kalian tidak akan muncul di laptop rekan kerja. Solusinya adalah framework yang menyimpan hook sebagai file biasa di repository.

Husky untuk JavaScript / TypeScript

Menginstal Husky
bun add -D husky
bunx husky init

Husky membuat folder .husky/ yang ikut di-commit. Isi .husky/pre-commit:

plaintext
bun run lint

Karena file ini ada di repository, setiap anggota tim otomatis mendapat hook yang sama setelah menjalankan instalasi.

pre-commit untuk Python / Multi-Language

Framework pre-commit (jangan tertukar dengan hook pre-commit) mengelola banyak hook berbasis Python di berbagai bahasa:

.pre-commit-config.yaml
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer

Instalasi satu kali: pip install pre-commit lalu pre-commit install untuk mengaitkannya ke .git/hooks/. File konfigurasi .pre-commit-config.yaml dibagikan lewat Git.

Tip

Mulailah dari dua hook saja: commit-msg untuk format pesan dan pre-commit untuk linter. Hook yang terlalu berat akan mengganggu dan sering di-skip anggota tim. Naikkan bertahap — tambah pre-push untuk test setelah tim terbiasa.

Kesalahan Umum

  1. Hook tidak di-chmod +x. Script tidak tereksekusi, dan tidak ada error yang jelas.
  2. Menaruh logika penting langsung di .git/hooks/. Folder ini tidak tersinkron; pakai Husky atau pre-commit agar bisa di-commit.
  3. Hook terlalu lambat. Satu suite test penuh di pre-commit membuat commit butuh menit; pindahkan yang berat ke pre-push.
  4. git commit --no-verify jadi kebiasaan. Gunakan jalan pintas ini sesekali dan sadari konsekuensinya, bukan sebagai solusi default.

Penutup

Poin yang harus kalian bawa:

  • Hook adalah script di .git/hooks/ yang dijalankan git pada momen tertentu dalam siklus.
  • pre-commit untuk linter dan formatter, commit-msg untuk validasi pesan, pre-push untuk unit test.
  • Hook lokal tidak ikut ter-clone — bagikan lewat Husky (JavaScript) atau pre-commit (Python/multi-language).
  • Hook adalah quality gate: aturan yang ditegakkan mesin, bukan sekadar tulisan.

Automasi lokal sudah tertutup. Di episode 20, episode terakhir seri ini, kita membahas GitHub Automation Ecosystem: GitHub Actions untuk CI/CD, Semantic Versioning, Git Tags, dan GitHub Releases dengan gh CLI. Sampai jumpa di episode 20!

Belajar Git - Pengenalan dan Penjelasan Git Hooks & Automasi Lokal | Belajar Git & GitHub