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.md dan src/app.txt, lalu hook pre-commit lima baris dipasang: kita pelajari satu-satunya bahasa yang dipahami Git, exit code, dengan membalik putusannya dari exit 0 ke exit 1;
  • validasi pesan — hook commit-msg berbasis Conventional Commits ditulis di folder hooks/ yang ikut ter-version-control, lalu dipasang ke .git/hooks/; pesan "update" ditolak, "feat: tambah keranjang" lolos;
  • pemeriksaan isi — hook pre-commit riil memeriksa staging area: whitespace error, jejak console.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.hooksPath yang 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 #

BagianFokusBekal utamaPerkiraan waktu
Bagian 1: Mengenal Hooksrintis web-toko, hook pertama, mekanisme exit codeKonsep Git Hooks15 menit
Bagian 2: Validasi Commit Messagehooks/commit-msg, pola Conventional Commits, pemasangan cpConventional Commits , Commit-Msg Hook20 menit
Bagian 3: Otomasi Pemeriksaanpre-commit: whitespace, jejak debug, berkas besar; skrip dipisah ke scripts/Pre-Commit Hook25 menit
Bagian 4: Pengujian dan Pemasangantabel kasus uji, core.hooksPath, clone oleh SitiMengelola Hooks25 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:

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:

text
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 .

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

scripts/validate-commit-message.sh

Unduh berkas
bash
#!/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