Proyek 05 menutup hari buruknya dengan satu kesimpulan: memulihkan itu bisa, tetapi terus memulihkan berarti kualitas proyek bergantung pada kecepatan tangan penyelamat. Penutupnya menyerahkan satu pekerjaan yang belum dimiliki tim — pencegahan yang berjalan sendiri setiap kali commit dibuat. Proyek ini membangun mesinnya. Kita menyiapkan repository proyek web-toko, lalu memasang gerbang kualitas bertingkat: hook pertama yang hanya berteriak lalu belajar menolak, hook kedua yang mengadili pesan commit, hook ketiga yang mengurai isi staging area — dan terakhir, cara memasang semuanya di mesin rekan kerja tanpa menyalin berkas satu per satu.
Semua pemeriksaan yang kita bangun nyata: skrip shell yang benar-benar berjalan di sandbox, dengan setiap penolakan dan kelulusan tertangkap apa adanya. Pola pengerjaannya sengaja perlahan — setiap hook diuji dengan masukan yang salah lebih dulu, baru dengan masukan yang benar — karena gerbang kualitas yang tidak pernah teruji menolak apa pun hanyalah dekorasi.
Apa yang Kita Bangun #
Panggunya adalah web-toko, repository toko web kecil milik tim Budi dan Siti. Bangunannya tumbuh melewati empat babak:
- mesin minimum — repository dirintis dengan
README.mddansrc/app.txt, lalu hookpre-commitlima baris dipasang: kita pelajari satu-satunya bahasa yang dipahami Git, exit code, dengan membalik putusannya dariexit 0keexit 1; - validasi pesan — hook
commit-msgberbasis Conventional Commits ditulis di folderhooks/yang ikut ter-version-control, lalu dipasang ke.git/hooks/; pesan"update"ditolak,"feat: tambah keranjang"lolos; - pemeriksaan isi — hook
pre-commitriil memeriksa staging area: whitespace error, jejakconsole.log/print(, dan berkas melebihi 1 MiB — semuanya diuji dengan commit kotor yang benar-benar ditolak; - pemasangan tim — hasil kerja diuji sistematis lewat tabel kasus uji, lalu diaktifkan lewat
core.hooksPathyang menunjuk folder versioned; clone baru oleh Siti membuktikan celahnya (hook tidak ikut ter-clone) sekaligus jalan keluarnya: satu perintah setup.
Hasil akhirnya: web-toko dengan sembilan commit yang seluruhnya lolos validasi, dan tiga berkas gerbang aktif — hooks/pre-commit, hooks/commit-msg, serta skrip inti scripts/validate-commit-message.sh — yang semuanya hidup di dalam repository, bukan di .git yang gelap.
Peta Empat Bagian #
| Bagian | Fokus | Bekal utama | Perkiraan waktu |
|---|---|---|---|
| Bagian 1: Mengenal Hooks | rintis web-toko, hook pertama, mekanisme exit code | Konsep Git Hooks | 15 menit |
| Bagian 2: Validasi Commit Message | hooks/commit-msg, pola Conventional Commits, pemasangan cp | Conventional Commits , Commit-Msg Hook | 20 menit |
| Bagian 3: Otomasi Pemeriksaan | pre-commit: whitespace, jejak debug, berkas besar; skrip dipisah ke scripts/ | Pre-Commit Hook | 25 menit |
| Bagian 4: Pengujian dan Pemasangan | tabel kasus uji, core.hooksPath, clone oleh Siti | Mengelola Hooks | 25 menit |
Total waktu pengerjaan sekitar 80–90 menit — satu sesi duduk yang utuh. Setiap bagian berdiri di atas keadaan akhir bagian sebelumnya, jadi kerjakan berurutan dari Bagian 1.
Prasyarat #
Materi berikut perlu dikuasai sebelum mulai; setiap konsep dipakai tanpa dijelaskan ulang di sini:
- aturan aktivasi hook (nama berkas, bit executable) dan mekanisme exit code — Konsep Git Hooks dari section Hooks dan Otomasi;
- format
type(scope): deskripsibeserta daftar type-nya — Conventional Commits dan Menulis Commit Message ; - teori kedua hook yang kita bangun — Pre-Commit Hook dan Commit-Msg Hook ;
- masalah distribusi hooks dan peran
core.hooksPath— Mengelola Hooks ; - perilaku
git commit --amend— Amend Commit ; - konsep staging area dan
git diff --cached— Modified, Staged, dan Committed serta Diff Staged dan Unstaged .
Alat yang dipakai adalah Git 2.9 ke atas (core.hooksPath baru hadir di versi itu); seluruh sesi diuji nyata pada Git 2.47.3.
Struktur Proyek dan Transkrip #
Panggung proyek ini bernama proyek-06 dengan susunan berikut:
proyek-06/
├── web-toko/ ← repository kerja (hooks/ + scripts/ versioned)
└── web-toko-siti/ ← clone oleh Siti (uji pemasangan tim)Berkas README.md, hooks/pre-commit, hooks/commit-msg, dan scripts/validate-commit-message.sh yang menyertai halaman proyek ini memuat kondisi akhir repository — bandingkan isinya dengan hasil kerja kita setelah Bagian 4 selesai.
Repository toko siap dirintis, dan penjaga pertamanya cuma butuh lima baris. Mari mulai: Bagian 1: Mengenal Hooks .
Buat hook pertama dan pahami cara Git menjalankannya.
Buka → # Bagian 2: Validasi Commit MessageBangun skrip validasi pesan commit dengan hook commit-msg.
Buka → # Bagian 3: Otomasi PemeriksaanTambahkan pemeriksaan isi berkas dengan hook pre-commit.
Buka → # Bagian 4: Pengujian dan PemasanganUji hooks dengan kasus gagal-lulus dan pasang sebagai template tim.
Buka →Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
scripts/validate-commit-message.sh
Unduh berkas#!/bin/sh
# validate-commit-message.sh — inti validasi pesan commit web-toko.
# Dipanggil oleh hooks/commit-msg dengan $1 = berkas pesan sementara
# (biasanya .git/COMMIT_EDITMSG). Aturan: Conventional Commits.
berkas_pesan="$1"
subjek="$(grep -v '^#' "$berkas_pesan" | sed '/^[[:space:]]*$/d' | head -n 1)"
pola='^(feat|fix|docs|chore|refactor|test)(\(.+\))?: .+'
if [ -z "$subjek" ]; then
echo "commit-msg: pesan kosong — tulis subjek dengan format type(scope): deskripsi" >&2
exit 1
fi
if ! printf '%s\n' "$subjek" | grep -qE "$pola"; then
{
echo "commit-msg: subjek ditolak: '$subjek'"
echo " format: type(scope): deskripsi — scope opsional"
echo " type: feat | fix | docs | chore | refactor | test"
echo " contoh: 'feat: tambah keranjang' atau 'fix(ui): benahi tombol bayar'"
} >&2
exit 1
fi
if [ "${#subjek}" -gt 72 ]; then
echo "commit-msg: subjek ${#subjek} karakter — maksimal 72: '$subjek'" >&2
exit 1
fi