Adopsi Conventional Commits pada repository lama dengan strategi mulai dari hari ini, pasang commitlint dan husky sebagai penjaga pesan commit, serta tangani history lama tanpa menulis ulang riwayat secara sembarangan.

Di episode 16 kita menulis plugin custom. Sekarang hadapi kenyataan pahit: sebagian besar repository nyata lahir tanpa Conventional Commits — pesan seperti update dan fix bug memenuhi history. Memaksakan semantic-release langsung di atas history seperti itu akan menghasilkan changelog kosong.
Episode ini membahas migrasi repository existing: strategi paling aman untuk mulai berdisiplin dari hari ini, setup commitlint dan husky agar aturan ditegakkan sejak commit pertama, dan cara memperlakukan history lama — termasuk kapan menulis ulang riwayat itu dibenarkan dan kapan sangat berbahaya.
Aturan paling penting dalam migrasi: jangan menulis ulang seluruh history. Commit lama yang berantakan sudah menjadi fakta; yang penting adalah ke depan. Ada beberapa langkah:
Pendekatan ini membuat migrasi berjalan tanpa menghentikan development, tanpa force push, dan tanpa risiko merusak kolaborasi.
commitlint memvalidasi pesan commit; husky menjalankan perintah Git hooks lokal. Setup dimulai dari menginstal dependency dan menginisialisasi husky:
bun add -D @commitlint/cli @commitlint/config-conventional husky
bunx husky init
bunx husky add .husky/commit-msg 'bunx --no -- commitlint --edit "$1"'Kemudian buat konfigurasi commitlint:
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [2, 'always', ['feat', 'fix', 'perf', 'refactor', 'docs', 'test', 'chore', 'build', 'ci', 'revert', 'style']],
'header-max-length': [2, 'always', 100],
'subject-case': [0],
},
};Dengan hook commit-msg di atas, setiap git commit otomatis menjalankan commitlint terhadap pesan commit. Jika pesan tidak valid, commit dibatalkan dengan pesan error — developer terpaksa memperbaiki sejak awal.
Tip
Jika repository sudah memakai husky untuk hook lain, cukup tambahkan file hook commit-msg tanpa menjalankan bunx husky init agar tidak menimpa konfigurasi yang ada. Uji dulu lint-nya dengan menjalankan bunx commitlint --edit secara manual di terminal.
Coba uji coba:
bunx commitlint --edit "update file readme"
✖ type may not be empty [type-empty]
✖ subject may not be empty [subject-empty]Keluaran di atas menunjukkan pesan update file readme ditolak karena tidak ada tipe di awal pesan. Dengan pola fix(readme): perbaiki tautan dokumentasi, commitlint akan menerimanya.
Tooling saja tidak cukup — tim butuh panduan singkat. Dokumen internal sebaiknya memuat:
feat untuk fitur baru, fix untuk perbaikan bug, chore untuk maintenance.(auth), (checkout).#N.BREAKING CHANGE: dan kapan memakai ! pada subject.Tegakkan lewat Code Review: reviewer menolak PR jika ada commit yang lolos hook, misalnya karena dikerjakan di mesin tanpa husky.
Warning
Hook hanya berjalan di mesin developer yang sudah setup husky. Developer dengan mesin baru atau editor dengan Git internal tertentu bisa saja melewati hook. Jadikan commitlint sebagai status check di CI juga — misalnya step bunx commitlint --from origin/main --to HEAD — supaya penegakan aturan tidak bergantung pada mesin lokal.
History lama tanpa conventional commits tidak harus dirombak. Cara teraman:
0.1.0 atau 1.0.0 tergantung jenis perubahan.git filter-repo — tetapi hanya dengan persetujuan seluruh tim dan tanpa force push ke branch yang sudah dipakai bersama.Caution
Menulis ulang history berarti setiap commit mendapat hash baru, sehingga semua clone developer, cache CI, dan pull request yang terbuka kehilangan korespondensi. Efeknya besar dan permanen. Lakukan hanya bila: repository masih muda, tim kecil, dan seluruh developer menyetujui serta melakukan hard reset. Untuk tim besar atau repository yang sudah lama dipakai, pilih strategi "mulai dari hari ini" tanpa rewrite.
Jika tetap terpaksa menulis ulang pesan commit, gunakan git filter-repo (penerus filter-branch yang jauh lebih aman dan cepat):
git clone --mirror <url-repository> repo-migrasi
cd repo-migrasi
git filter-repo --message-callback 'return b"fix: " + message if message.startswith(b"fix") else message'Skrip callback di atas menambahkan awalan fix: pada pesan yang sudah diawali kata fix sehingga tetap valid secara conventional. Semua commit yang ditulis ulang mendapat hash baru — sekali lagi, koordinasikan sebelum menjalankan.
Rekap episode 17:
Setelah aturan commit ditegakkan, saatnya memastikan release berjalan sehat. Di episode 18 kita membahas Release Monitoring & Post-release Checks — observability rilis, validasi pasca-rilis, dan kesiapan rollback. Sampai jumpa!