Panduan Lengkap Git Hooks: Instalasi, Penggunaan, dan Tips
Pelajari cara menggunakan Git hooks untuk mengotomatiskan tugas, menegakkan standar kode, dan mengamankan alur kerja Anda dengan pre-commit, pre-push, dan server-side hooks.
Git hooks memungkinkan Anda mengotomatiskan tugas dalam alur kerja dengan menjalankan skrip sebelum atau sesudah aksi Git seperti commit atau push. Ini membantu menemukan masalah lebih awal, menegakkan standar, dan bahkan memperbaiki masalah secara otomatis.
Misalnya, Anda menulis skrip untuk menegakkan standar pemformatan kode. Anda dapat menambahkan skrip itu ke hook yang berjalan sebelum commit. Sekarang, setiap kali seseorang mencoba melakukan commit, hook tersebut berjalan. Jika kode lolos pengecekan dalam hook, commit dilanjutkan. Jika tidak, commit akan diblokir.
Dan bukan hanya untuk menandai masalah. Anda juga bisa menyesuaikan skrip untuk memperbaiki masalah tersebut sebelum commit terjadi. Dalam artikel ini, saya akan membahas semua yang perlu Anda ketahui tentang Git hooks: apa itu, mana yang penting, dan cara menerapkannya secara efektif.
Apa Itu Git Hooks?
Git hooks secara otomatis menjalankan skrip kustom ketika aksi Git tertentu terjadi, seperti sebelum atau sesudah commit, push, atau merge. Hooks ini sudah tersedia di Git, jadi tidak perlu memasang pustaka eksternal apa pun.
Saat Anda menginisialisasi repositori Git, Git membuat hooks secara default. Anda akan menemukannya di dalam direktori .git/hooks. File tersebut memiliki ekstensi .sample, yang mencegahnya berjalan secara default. Jika Anda ingin hook berjalan secara default, cukup hapus ekstensi .sample.
Anda dapat menulis hooks dalam bahasa skrip apa pun yang dapat dieksekusi. Misalnya, di dalam file pre-commit hook, Anda bisa menambahkan skrip yang memeriksa komentar "To-do" di file yang di-stage dan memblokir commit jika ditemukan. Artinya, setiap kali Anda mencoba commit, Git memindai komentar yang diawali dengan “To-do” dan gagal jika masih ada tugas tertunda. Dengan cara ini, Anda dapat membuat hook kustom untuk berbagai aksi Git seperti post-commit, pre-merge, pre-push, dan lainnya.
Jenis-Jenis Git Hooks
Sebelum masuk ke contoh praktis, mari pahami dua jenis Git hooks.
Client-side hooks: kategori dan contoh umum
Client-side hooks berjalan di mesin lokal selama operasi Git, seperti commit, rebase, dan push. Berikut beberapa hook klien populer dan kasus penggunaannya.
pre-commit: Berjalan sebelum Anda mengetik pesan commit. Anda dapat menggunakannya untuk menegakkan gaya kode, menjalankan tes, atau memeriksa kesalahan sintaks sebelum commit.
prepare-commit-msg: Berjalan setelah Git membuat pesan commit default, tetapi sebelum editor pesan commit muncul. Hook ini dapat mengubah atau mengganti pesan default berdasarkan logika skrip kustom.
commit-msg: Hook ini berjalan tepat setelah pesan commit disimpan, tetapi sebelum Git menyelesaikan commit. Ini adalah pos pemeriksaan terakhir Anda untuk menegakkan aturan pesan commit seperti format, struktur, atau penandaan.
post-commit: Berjalan setelah commit dibuat. Sering digunakan untuk notifikasi (misalnya mengirim pesan Slack setelah commit) atau pencatatan (menyimpan metadata commit).
post-checkout: Berjalan setelah perintah git checkout berhasil. Ini dipicu ketika Anda berpindah cabang atau checkout commit atau path tertentu. Anda dapat menggunakannya untuk membangun ulang dependensi proyek, menghapus file sementara, atau memberi tahu tentang cabang baru.
post-merge: Berjalan setelah operasi merge berhasil. Umumnya digunakan untuk memperbarui dependensi, menampilkan pesan merge, atau membersihkan cache.
pre-rebase: Berjalan sebelum operasi rebase. Anda dapat menggunakannya untuk mencegah rebase pada cabang yang diproteksi, menjalankan tes sebelum mengizinkan rebase, atau menghentikan rebase jika ada perubahan yang belum di-commit.
pre-push: Berjalan sebelum mendorong perubahan. Ini membantu mencegah push ke cabang yang diproteksi atau menjalankan tes pre-push.
post-rewrite: Berjalan setelah Git berhasil menulis ulang commit. Ini dipicu pada operasi seperti git commit --amend (yang menulis ulang commit terakhir) atau git rebase (yang menulis ulang serangkaian commit). Gunakan untuk memperbarui referensi atau memicu tes dan langkah CI setelah penulisan ulang.
pre-applypatch: Dipanggil oleh perintah git am, hook ini berjalan setelah patch diterapkan ke working tree tetapi sebelum commit baru dibuat. Jika pemeriksaan dalam hook ini gagal, hook dapat keluar dengan status non-zero dan mencegah patch di-commit.
post-applypatch: Git menjalankannya setelah menerapkan patch dan membuat commit. Hook ini tidak dapat membatalkan commit tetapi cocok untuk pencatatan atau pengiriman notifikasi.
applypatch-msg: Git menjalankannya sebelum git am menerapkan patch. Gunakan untuk memeriksa atau mengedit pesan commit yang diusulkan untuk patch.
Server-side hooks: kategori dan kasus penggunaan
Server-side hooks berjalan di server Git jarak jauh dan dipicu ketika terjadi peristiwa jarak jauh, seperti sebelum atau sesudah push ke repositori.
pre-receive: Remote menjalankannya sebelum menerima push. Anda dapat menggunakannya untuk menegakkan gaya kode yang konsisten di seluruh pengguna atau menjalankan pemeriksaan keamanan sebelum menerima perubahan dari klien.
update: Sementara pre-receive berjalan sekali per push, hook update berjalan untuk setiap referensi (cabang atau tag) yang diubah dalam satu push.
post-receive: Berjalan setelah operasi git push selesai. Sering digunakan untuk mengirim notifikasi, pencatatan komprehensif, atau memicu pipeline CI/CD.
post-update: Berjalan setelah Git memperbarui semua referensi dalam sebuah push. Anda dapat menggunakannya untuk notifikasi sederhana karena, tidak seperti post-receive, hook ini tidak dapat mengakses log lama dan baru dari setiap pembaruan referensi.
reference-transaction: Dipicu ketika transaksi referensi dipersiapkan, di-commit, atau dibatalkan sehingga dapat berjalan beberapa kali. Gunakan untuk memvalidasi atau menolak pembaruan di banyak referensi dalam satu transaksi, atau untuk mencatat dan mengaudit perubahan ref.
push-to-checkout: Dipicu ketika Anda melakukan git push ke cabang yang saat ini sedang di-checkout di remote. Dengan hook ini, Anda dapat memperbarui file di server setelah push, mencatat perubahan, atau memblokir push yang tidak aman langsung ke working directory.
pre-auto-gc: Berjalan tepat sebelum Git memicu garbage collection otomatis. Anda dapat menggunakannya untuk mencatat mulai garbage collection, memblokirnya saat operasi berat sumber daya, atau menangani tugas yang diperlukan sebelum garbage collection.
proc-receive: Berjalan ketika perintah git-receive-pack memproses push yang masuk. Hook ini memperbarui referensi (cabang dan tag) di repositori remote dan melaporkan hasilnya kembali ke klien.
Menyiapkan Git Hooks
Di bagian ini, Anda akan menemukan langkah-langkah untuk memasang dan menyiapkan git hooks. Anda juga akan melihat cara membuat hook kustom dari nol.
Mekanisme instalasi dan konfigurasi
Saat Anda menginisialisasi repositori Git, Git secara otomatis membuat serangkaian hooks di dalam folder .git/hooks. Untuk melihatnya, buka terminal dan masuk ke root repositori tempat Anda menjalankan git init. Dari sana, buka direktori tersembunyi .git lalu subdirektori hooks. Perintah cd sederhana melakukan semua ini untuk Anda dan memberi akses ke subdirektori hooks.
Setelah Anda masuk, Anda akan melihat hooks default dengan ekstensi .sample. Untuk mengaktifkan hook default, hapus ekstensi .sample untuk hook tersebut dan buat agar dapat dieksekusi.
Sebagai contoh, gunakan perintah di bawah ini untuk menghapus ekstensi .sample dari pre-commit hook.
mv .git/hooks/pre-commit.sample .git/hooks/pre-commitDidukung oleh
Selanjutnya, jadikan dapat dieksekusi dengan perintah di bawah ini:
Pada contoh di atas, setiap kali commit berhasil, hook akan mencetak pesan " Commit message hook triggered"
Ada cara lain untuk menyiapkan hook kustom. Saat Anda menginisialisasi repositori, Git menyertakan hooks default. Anda dapat mengedit default ini menggunakan direktori template.
Begini cara kerjanya: Saat Anda menjalankan git init, Git menyalin isi direktori template global ke dalam direktori .git/ repositori baru, termasuk hooks. Jika Anda menambahkan skrip hook kustom ke direktori template global, setiap repositori baru yang Anda buat akan mewarisi hooks kustom tersebut secara otomatis.
Membuat dan menyesuaikan skrip hook
Pertama, Anda perlu menentukan apa yang ingin dicapai. Apakah menangkap pesan commit yang samar, mencegah push tidak sengaja, atau membersihkan cache? Menentukan tujuan di awal penting karena setiap git hook memiliki tujuan berbeda, dan Anda harus tahu yang mana yang digunakan.
Misalnya, jika Anda ingin memeriksa gaya pesan commit, gunakan hook commit-msg. Jika Anda ingin menghindari push tertentu ke main branch, lakukan dengan hook pre-push.
Setelah memilih hook, keputusan berikutnya adalah bahasa. Di macOS dan Linux, skrip Bash kecil (atau sh biasa) sering sudah cukup. Di Windows, beberapa tim menggunakan PowerShell.
Jika repo Anda poliglot, Anda mungkin lebih suka interpreter universal seperti Python atau Node.js agar semua orang dapat menjalankan logika yang sama. Karena itu, kuncinya adalah menyertakan shebang (#!/bin/sh, #!/usr/bin/env python3, dll.) di bagian atas agar Git tahu cara mengeksekusinya.
Contoh pre-commit hook sederhana yang mencegah commit file .env. Ini menghindari pendorongan kunci API sensitif secara tidak sengaja.
#!/bin/sh
# Block committing secrets
if git diff --cached --name-only | grep -q ".env"; then
echo "❌ .env file detected in commit! Remove it before committing."
exit 1
fi
exit 0Didukung oleh
Saat Anda ingin menonaktifkan hooks, cara termudah adalah mengganti namanya sementara (ubah pre-commit menjadi pre-commit.off) atau menghapus izin eksekusinya.
Namun, jika Anda hanya perlu melewatinya sekali, gunakan git commit --no-verify untuk melewati commit hook dan git push --no-verify untuk melewati push hook. Anda bahkan dapat menonaktifkan hooks secara global dengan mengarahkan Git ke folder kosong menggunakan git config core.hooksPath /dev/null.
Kasus Penggunaan Umum dan Contoh Git Hooks
Git hooks sangat berguna untuk mengotomatiskan pengujian, pemeriksaan keamanan, dan menegakkan standar kualitas dalam alur kerja Anda.
Skenario automasi praktis
Terapkan gaya kode atau linting: Pre-commit hook sering digunakan untuk mengotomatiskan pemformatan kode dan menangkap potensi kesalahan sebelum commit dilakukan.
Misalnya, pada pre-commit hook berikut, prettier menangani pemformatan secara otomatis dan melakukan staging perubahan sebelum commit. Linter kemudian dapat berjalan setelahnya, dan commit hanya berhasil jika linting lolos. Jika gagal, commit dihentikan.
#!/bin/sh
# Collect staged JS/TS files
FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|tsx)$')
[ -z "$FILES" ] && exit 0
echo "Formatting with Prettier..."
npx --yes prettier --write $FILES
# Re-stage files that Prettier changed
echo "$FILES" | xargs git add
echo "Linting with ESLint..."
npx --yes eslint $FILES
STATUS=$?
if [ $STATUS -ne 0 ]; then
echo "ESLint found issues. Fix them or commit with --no-verify if needed."
exit $STATUS
fi
echo "Pre-commit checks passed."
exit 0Didukung oleh
Jalankan pengujian otomatis: Anda dapat mengatur hooks untuk menjalankan pengujian otomatis sebelum mendorong perubahan apa pun. Misalnya, pre-push hook berikut secara otomatis menemukan dan menjalankan pytest yang tersedia di repo Anda sebelum mendorong perubahan.
Blokir otomatis commit data sensitif: File sensitif seperti .env, .pem, atau .key sering kali berisi rahasia. Contoh pre-commit hook berikut memeriksa pola semacam itu dan memblokir commit jika mengandungnya.
#!/bin/sh
set -e
STAGED=$(git diff --cached --name-only --diff-filter=ACM)
# Block dotenv and private keys
echo "$STAGED" | grep -E '\.env(\.|$)|(^|/)\.env$|\.pem$|\.key$|id_rsa$' >/dev/null 2>&1 && {
echo "Sensitive file detected in staged changes. Remove it from the commit."
exit 1
}Didukung oleh
Tips Menulis Git Hooks yang Efektif
Di sini, saya sertakan beberapa tips yang saya rasa membantu saat menulis Git hooks.
Jaga hooks tetap cepat
Hooks berjalan setiap kali Anda memicu aksi Git tertentu, jadi buatlah tetap ringan. Jika Anda memiliki rangkaian tes besar, jalankan di CI alih-alih pada hooks lokal untuk performa yang lebih baik. Menjalankan linter, formatter, atau pemeriksaan di seluruh repositori pada setiap commit akan memperlambat Anda, jadi batasi pemeriksaan pada file yang benar-benar berubah.
Pertahankan kompatibilitas lintas platform
Pastikan hooks Anda berjalan mulus di berbagai sistem operasi. Gunakan shebang portabel, tangani akhir baris secara konsisten (gunakan LF daripada CRLF), dan jangan hardcode path absolut.
Sebaliknya, andalkan PATH dan skrip proyek lokal seperti npm run lint atau python -m agar dapat berjalan di berbagai lingkungan.
Strategi debugging
Tambahkan logging yang rinci atau flag debug (misalnya, HOOK_DEBUG=1) untuk melacak bagaimana skrip berjalan. Cetak detail seperti direktori saat ini, cabang, atau file yang di-stage. Ini memudahkan mengikuti alur eksekusi dan menemukan titik masalah.
Uji hooks dengan input berbeda dan simulasi skenario kegagalan secara lokal sebelum mendorong perubahan. Jika hook memblokir progres secara tak terduga, Anda dapat melewatinya sementara dengan flag --no-verify milik Git atau dengan variabel lingkungan yang dirancang untuk melewati hooks.
Untuk mempertahankan perilaku yang konsisten di berbagai sistem operasi, hindari perintah spesifik OS, dan pilih bahasa skrip yang portabel.
Dokumentasikan hooks dengan jelas
Dokumentasi yang baik meningkatkan pemahaman tim dan memudahkan onboarding anggota baru. Pertahankan README terpusat yang merinci tujuan, perilaku, dan penggunaan setiap hook. Sertakan cara menjalankan, prasyarat, pemecahan masalah, dan tips bypass. Juga, sediakan instruksi instalasi/penyiapan.
Teknik Implementasi Lanjutan dan Praktik Terbaik untuk Git Hooks
Jika Anda pengguna tingkat lanjut, tips ini bisa membantu:
Optimasi performa
Untuk mengoptimalkan performa dalam alur kerja yang kompleks, kurangi dependensi eksternal dengan menghindari pustaka berat. Ini menurunkan waktu startup dan mengurangi titik kegagalan.
Cache hasil proses mahal seperti linting sehingga Anda dapat menggunakannya kembali ketika file tidak berubah.
Jika hooks berisi banyak pemeriksaan, jalankan paralel agar berjalan bersamaan. Juga, modulerkan skrip hook. Artinya, strukturkan hooks sebagai komponen kecil yang dapat digunakan ulang yang hanya mengeksekusi bagian relevan berdasarkan konteks.
Hook chaining dan orkestrasi
Gunakan hook chaining untuk menjalankan beberapa hook pada satu peristiwa git. Misalnya, pada pre-commit hook, Anda mungkin ingin menjalankan linting, lalu tes, kemudian memformat kode, semuanya berantai. Setiap perintah berjalan satu demi satu, dan jika ada yang gagal (keluar dengan status non-zero), perintah berikutnya dapat dilewati untuk mencegah commit yang buruk.
Ketika aksi hook saling independen, Anda juga dapat menjalankannya secara paralel untuk menghemat waktu. Di sinilah Anda menggunakan orkestrasi untuk mengelola eksekusi tugas dalam urutan yang benar.
Manajemen konfigurasi
Setiap repo memiliki direktori .git/hooks sendiri. Artinya jika Anda menginginkan pemeriksaan yang sama (misalnya linting) di banyak proyek, Anda harus menyalinnya ke mana-mana. Cara yang lebih baik adalah mengelola hooks secara terpusat sehingga semua repositori dapat mengakses dan menjalankannya.
Anda dapat melakukannya dengan satu perintah: git config --global core.hooksPath ~/.githooks. Ini memberi tahu Git untuk mencari hooks di folder ~/.githooks. Hook apa pun yang Anda buat di sana akan otomatis dibagikan ke semua repositori Anda.
Anda juga dapat membuat logika hook lebih dinamis dengan file konfigurasi (JSON atau YAML). Alih-alih hardcode logika berbeda untuk tiap repositori, skrip hook Anda dapat membaca file konfigurasi repositori tersebut dan menerapkan aturan yang benar secara otomatis.
Eksekusi kondisional
Di dalam skrip hook, Anda dapat menambahkan kondisi sederhana agar hanya berjalan ketika relevan. Misalnya memeriksa nama cabang saat ini, melihat file mana yang benar-benar berubah, atau membaca variabel lingkungan yang memerintahkan untuk melewati eksekusi.
Jika Anda ingin kontrol lebih, gunakan kerangka kerja seperti pre-commit, di mana Anda mendeklarasikan di file konfigurasi hook mana yang berjalan pada tahap mana. Anda juga bisa menambahkan logika kondisional, seperti menjalankan hook hanya pada cabang tertentu, melewati hook dengan variabel, atau bahkan menambahkan kondisi berbasis waktu. Ini membuat skrip hook Anda dinamis dan selaras dengan alur kerja nyata.
Strategi kolaborasi dan berbagi
Ada dua cara Anda dapat memusatkan git hooks dan membagikannya di seluruh repositori dan tim:
Template Git
Saat Anda menginisialisasi repositori, Git menambahkan beberapa hook default di bawah direktori git/hooks. Hook ini berasal dari template default Git.
Untuk membuat hooks kustom secara terpusat, Anda dapat membuat direktori template Git, menulis hooks Anda di sana, dan mengatur Git secara global untuk menggunakan direktori baru ini sebagai template default.
git config --global init.templateDir /path/to/hooks-templateDidukung oleh
Namun metode ini tidak memiliki kontrol versi untuk hooks. Ini terutama berguna jika hooks jarang berubah. Jika Anda sering memperbarui hooks dan memerlukan kontrol versi, gunakan metode berikutnya.
Repo git pusat
Buat repositori pusat khusus yang dikontrol versi dan simpan semua skrip hook kustom Anda di repo tersebut, terpisah dari repo proyek. Jadi Anda dapat memperbarui hooks secara independen dari basis kode proyek.
Hooks ini harus distandardisasi, artinya hindari hardcode path atau nilai yang terikat pada satu repositori.
Pengaturan ini sangat berguna untuk tim, karena semua orang dapat menarik pembaruan secara berkala dan menyinkronkannya ke proyek mereka.
Pendekatan yang lebih efisien adalah menggunakan skrip setup yang mengkloning repo hooks pusat dan menyalin skrip hook ke direktori .git/hooks di setiap proyek. Contoh skrip setup:
#!/usr/bin/env bash
set -euo pipefail
# Location of the shared hooks template repo
HOOKS_TEMPLATE_REPO="[email protected]:your-org/git-hooks-template.git"
HOOKS_TEMPLATE_DIR="$HOME/.git-hooks-template"
# Clone or update the template repo
echo "Cloning hooks template repo..."
git clone "$HOOKS_TEMPLATE_REPO" "$HOOKS_TEMPLATE_DIR"
# The repo where you want hooks installed
TARGET_REPO="${1:-$(pwd)}"
TARGET_HOOKS_DIR="$TARGET_REPO/.git/hooks"
# --- Copy strategy ---
echo "Copying hooks into $TARGET_HOOKS_DIR..."
cp -r "$HOOKS_TEMPLATE_DIR/"* "$TARGET_HOOKS_DIR/"
# 4. Make sure hooks are executable
chmod +x "$TARGET_HOOKS_DIR"/* || true
echo "✅ Hooks installed successfully into $TARGET_REPO"Didukung oleh
Opsi lain adalah menggunakan symlink. Anda dapat menautkan direktori .git/hooks setiap proyek ke skrip di repo hooks yang dikontrol versi. Jadi setiap kali Anda memperbarui repo pusat, hooks akan otomatis diperbarui karena symlink mengarah ke sana.
Untuk menjaga sistem ini andal, siapkan proses yang jelas untuk memelihara hooks. Anggota tim harus mengusulkan perubahan hooks melalui pull request, merge hanya setelah ditinjau, dan menjaga dokumentasi tetap mutakhir seiring perkembangan hooks.
Mengintegrasikan Git Hooks dengan Alur Pengembangan
Git hooks berperan besar dalam continuous integration (CI). Secara umum, CI berarti sering menggabungkan perubahan, lalu menjalankan build dan tes untuk menemukan masalah lebih awal. Dengan menghubungkan hooks dengan alat CI/CD seperti Jenkins, GitHub Actions, atau GitLab CI, Anda dapat memicu build, menjalankan tes, dan bahkan menerapkan aplikasi secara otomatis berdasarkan peristiwa Git.
Sebagai contoh, server-side pre-receive hook menjalankan skrip kustom di server Git sebelum menerima push. Jika skrip gagal, server menolak push. Anda dapat menggunakannya untuk memeriksa apakah build CI terbaru pada cabang tersebut lolos sebelum mengizinkan push. Jalur CI itu mungkin mencakup pemeriksaan cakupan kode, uji unit atau integrasi, atau bahkan pemindaian keamanan.
Hooks juga dapat mengotomatiskan tugas deployment. Post-receive hook dapat memicu webhook yang memulai pipeline CI/CD. Ketika kode digabungkan ke main, siklus build → deploy → rilis akan berjalan otomatis.
Pertimbangan Keamanan dan Praktik Terbaik
Jika Anda memelihara hooks terpusat untuk mempermudah kolaborasi dan satu sumber kebenaran, pastikan direktori hooks memiliki izin file yang aman untuk mencegah akses tidak sah. Hanya pengguna tepercaya yang boleh memiliki akses tulis.
Selalu validasi input atau parameter yang diterima skrip hook Anda untuk menghindari serangan injeksi kode. Misalnya, validasi input terhadap pola ketat seperti hanya mengizinkan nama cabang dengan alfanumerik dan tanda hubung, atau tag yang cocok dengan vMAJOR.MINOR.PATCH.
Jangan pernah menaruh data sensitif secara hardcode di skrip hook. Gunakan variabel lingkungan atau alat manajemen rahasia khusus untuk memberikan kredensial secara aman saat runtime. Anda dapat mengintegrasikan alat seperti Gitleaks dengan pre-commit hook untuk menjalankan pemindaian keamanan terhadap informasi sensitif dalam perubahan yang akan Anda commit.
Seseorang dapat mengarahkan ulang hook Anda untuk mengirimkan kode atau informasi ke server lain. Jadi batasi domain mana yang dapat dijangkau oleh hooks Anda. Gunakan proxy atau firewall untuk memblokir server tujuan yang tidak dikenal. Juga, pastikan log Anda tidak menampilkan info rahasia dalam pesan tampilan.
Kesimpulan
Git hooks adalah cara yang kuat untuk mengotomatiskan tugas dan menegakkan standar langsung dalam alur kerja pengembangan Anda. Hooks membantu mulai dari gaya kode dan pengujian hingga deployment dan pemeriksaan keamanan.
Dengan menggunakannya dengan baik, Anda mengurangi kesalahan, menghemat waktu, dan membuat kolaborasi lintas tim lebih lancar.
Mulailah dengan pemeriksaan pre-commit sederhana, lalu coba pengaturan yang lebih lanjut seperti orkestrasi, manajemen terpusat, atau integrasi CI/CD. Jika Anda pengguna Git dan ingin mengembangkan keterampilan, lihat kursus Git tingkat lanjut ini.
Git Hooks FAQs
Di mana saya dapat menemukan Git hooks?⌄
Path default Git untuk hooks adalah . git/hooks dan folder ini biasanya tersembunyi, sehingga Anda hanya dapat mengaksesnya melalui bash atau terminal.
Apa praktik terbaik untuk menyiapkan pre-commit hooks?⌄
Jaga hooks tetap cepat dan jalankan pada file yang di-stage untuk performa lebih tinggi. Jangan gunakan pre-commit hooks untuk tugas yang memakan waktu seperti menjalankan seluruh rangkaian tes; gunakan pipeline CI/CD Anda untuk itu. Dan dokumentasikan tujuannya dengan jelas.
Apa perbedaan server-side Git hooks dengan client-side hooks?⌄
Client-side hooks berjalan di mesin pengembang untuk umpan balik dan perbaikan otomatis. Contoh: pre-commit, pre-push.
Server-side hooks berjalan di server Git remote dan melakukan pemeriksaan kritis untuk pipeline produksi yang mulus serta kolaborasi tim yang efektif. Contoh: pre-receive, update. Jika server hook menolak push, perubahan tidak akan masuk.
Bisakah saya menggunakan Git hooks untuk menegakkan standar pengkodean?⌄
Gunakan pre-commit untuk format dan lint, commit-msg untuk menegakkan konvensi pesan, pre-push untuk tes cepat, dan server pre-receive untuk memblokir rahasia agar tidak ter-commit ke remote.
Srujana adalah penulis lepas di bidang teknologi dengan gelar sarjana Ilmu Komputer. Menulis tentang berbagai topik, termasuk data science, komputasi awan, pengembangan, pemrograman, keamanan, dan banyak lainnya adalah hal yang alami baginya. Ia menyukai sastra klasik dan menjelajahi destinasi baru.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Pelajari pengendalian versi dengan Git, mulai dari dasar hingga alur kerja tingkat lanjut. Lacak perubahan, kelola repositori, dan kolaborasi secara efisien.
Git hooks memungkinkan Anda mengotomatiskan tugas dalam alur kerja dengan menjalankan skrip sebelum atau sesudah aksi Git seperti commit atau push. Ini membantu menemukan masalah lebih awal, menegakkan standar, dan bahkan memperbaiki masalah secara otomatis.
Misalnya, Anda menulis skrip untuk menegakkan standar pemformatan kode. Anda dapat menambahkan skrip itu ke hook yang berjalan sebelum commit. Sekarang, setiap kali seseorang mencoba melakukan commit, hook tersebut berjalan. Jika kode lolos pengecekan dalam hook, commit dilanjutkan. Jika tidak, commit akan diblokir.
Dan bukan hanya untuk menandai masalah. Anda juga bisa menyesuaikan skrip untuk memperbaiki masalah tersebut sebelum commit terjadi. Dalam artikel ini, saya akan membahas semua yang perlu Anda ketahui tentang Git hooks: apa itu, mana yang penting, dan cara menerapkannya secara efektif.
Apa Itu Git Hooks?
Git hooks secara otomatis menjalankan skrip kustom ketika aksi Git tertentu terjadi, seperti sebelum atau sesudah commit, push, atau merge. Hooks ini sudah tersedia di Git, jadi tidak perlu memasang pustaka eksternal apa pun.
Saat Anda menginisialisasi repositori Git, Git membuat hooks secara default. Anda akan menemukannya di dalam direktori
.git/hooks. File tersebut memiliki ekstensi.sample, yang mencegahnya berjalan secara default. Jika Anda ingin hook berjalan secara default, cukup hapus ekstensi.sample.Anda dapat menulis hooks dalam bahasa skrip apa pun yang dapat dieksekusi. Misalnya, di dalam file pre-commit hook, Anda bisa menambahkan skrip yang memeriksa komentar "To-do" di file yang di-stage dan memblokir commit jika ditemukan. Artinya, setiap kali Anda mencoba commit, Git memindai komentar yang diawali dengan “To-do” dan gagal jika masih ada tugas tertunda. Dengan cara ini, Anda dapat membuat hook kustom untuk berbagai aksi Git seperti post-commit, pre-merge, pre-push, dan lainnya.
Jenis-Jenis Git Hooks
Sebelum masuk ke contoh praktis, mari pahami dua jenis Git hooks.
Client-side hooks: kategori dan contoh umum
Client-side hooks berjalan di mesin lokal selama operasi Git, seperti commit, rebase, dan push. Berikut beberapa hook klien populer dan kasus penggunaannya.
git checkoutberhasil. Ini dipicu ketika Anda berpindah cabang atau checkout commit atau path tertentu. Anda dapat menggunakannya untuk membangun ulang dependensi proyek, menghapus file sementara, atau memberi tahu tentang cabang baru.git commit --amend(yang menulis ulang commit terakhir) ataugit rebase(yang menulis ulang serangkaian commit). Gunakan untuk memperbarui referensi atau memicu tes dan langkah CI setelah penulisan ulang.git am, hook ini berjalan setelah patch diterapkan ke working tree tetapi sebelum commit baru dibuat. Jika pemeriksaan dalam hook ini gagal, hook dapat keluar dengan status non-zero dan mencegah patch di-commit.git ammenerapkan patch. Gunakan untuk memeriksa atau mengedit pesan commit yang diusulkan untuk patch.Server-side hooks: kategori dan kasus penggunaan
Server-side hooks berjalan di server Git jarak jauh dan dipicu ketika terjadi peristiwa jarak jauh, seperti sebelum atau sesudah push ke repositori.
Menyiapkan Git Hooks
Di bagian ini, Anda akan menemukan langkah-langkah untuk memasang dan menyiapkan git hooks. Anda juga akan melihat cara membuat hook kustom dari nol.
Mekanisme instalasi dan konfigurasi
Saat Anda menginisialisasi repositori Git, Git secara otomatis membuat serangkaian hooks di dalam folder
.git/hooks. Untuk melihatnya, buka terminal dan masuk ke root repositori tempat Anda menjalankangit init. Dari sana, buka direktori tersembunyi.gitlalu subdirektori hooks. Perintahcdsederhana melakukan semua ini untuk Anda dan memberi akses ke subdirektori hooks.Setelah Anda masuk, Anda akan melihat hooks default dengan ekstensi
.sample. Untuk mengaktifkan hook default, hapus ekstensi.sampleuntuk hook tersebut dan buat agar dapat dieksekusi.Sebagai contoh, gunakan perintah di bawah ini untuk menghapus ekstensi
.sampledari pre-commit hook.Selanjutnya, jadikan dapat dieksekusi dengan perintah di bawah ini:
Itu mencakup pengeditan dan pengaktifan hook default. Untuk membuat hook kustom dari nol, ikuti langkah-langkah berikut.
Untuk membuka file baru di
.git/hooks/, jalankan:Buat skrip di file ini. Contoh:
Simpan dan keluar, lalu jadikan dapat dieksekusi:
Pada contoh di atas, setiap kali commit berhasil, hook akan mencetak pesan
" Commit message hook triggered"Ada cara lain untuk menyiapkan hook kustom. Saat Anda menginisialisasi repositori, Git menyertakan hooks default. Anda dapat mengedit default ini menggunakan direktori template.
Begini cara kerjanya: Saat Anda menjalankan
git init, Git menyalin isi direktori template global ke dalam direktori.git/repositori baru, termasuk hooks. Jika Anda menambahkan skrip hook kustom ke direktori template global, setiap repositori baru yang Anda buat akan mewarisi hooks kustom tersebut secara otomatis.Membuat dan menyesuaikan skrip hook
Pertama, Anda perlu menentukan apa yang ingin dicapai. Apakah menangkap pesan commit yang samar, mencegah push tidak sengaja, atau membersihkan cache? Menentukan tujuan di awal penting karena setiap git hook memiliki tujuan berbeda, dan Anda harus tahu yang mana yang digunakan.
Misalnya, jika Anda ingin memeriksa gaya pesan commit, gunakan hook commit-msg. Jika Anda ingin menghindari push tertentu ke main branch, lakukan dengan hook pre-push.
Setelah memilih hook, keputusan berikutnya adalah bahasa. Di macOS dan Linux, skrip Bash kecil (atau sh biasa) sering sudah cukup. Di Windows, beberapa tim menggunakan PowerShell.
Jika repo Anda poliglot, Anda mungkin lebih suka interpreter universal seperti Python atau Node.js agar semua orang dapat menjalankan logika yang sama. Karena itu, kuncinya adalah menyertakan shebang (#!/bin/sh, #!/usr/bin/env python3, dll.) di bagian atas agar Git tahu cara mengeksekusinya.
Contoh pre-commit hook sederhana yang mencegah commit file
.env. Ini menghindari pendorongan kunci API sensitif secara tidak sengaja.Saat Anda ingin menonaktifkan hooks, cara termudah adalah mengganti namanya sementara (ubah pre-commit menjadi pre-commit.off) atau menghapus izin eksekusinya.
Namun, jika Anda hanya perlu melewatinya sekali, gunakan
git commit --no-verifyuntuk melewati commit hook dangit push --no-verifyuntuk melewati push hook. Anda bahkan dapat menonaktifkan hooks secara global dengan mengarahkan Git ke folder kosong menggunakangit config core.hooksPath /dev/null.Kasus Penggunaan Umum dan Contoh Git Hooks
Git hooks sangat berguna untuk mengotomatiskan pengujian, pemeriksaan keamanan, dan menegakkan standar kualitas dalam alur kerja Anda.
Skenario automasi praktis
Terapkan gaya kode atau linting: Pre-commit hook sering digunakan untuk mengotomatiskan pemformatan kode dan menangkap potensi kesalahan sebelum commit dilakukan.
Misalnya, pada pre-commit hook berikut, prettier menangani pemformatan secara otomatis dan melakukan staging perubahan sebelum commit. Linter kemudian dapat berjalan setelahnya, dan commit hanya berhasil jika linting lolos. Jika gagal, commit dihentikan.
Jalankan pengujian otomatis: Anda dapat mengatur hooks untuk menjalankan pengujian otomatis sebelum mendorong perubahan apa pun. Misalnya, pre-push hook berikut secara otomatis menemukan dan menjalankan pytest yang tersedia di repo Anda sebelum mendorong perubahan.
Blokir otomatis commit data sensitif: File sensitif seperti
.env,.pem, atau.keysering kali berisi rahasia. Contoh pre-commit hook berikut memeriksa pola semacam itu dan memblokir commit jika mengandungnya.Tips Menulis Git Hooks yang Efektif
Di sini, saya sertakan beberapa tips yang saya rasa membantu saat menulis Git hooks.
Jaga hooks tetap cepat
Hooks berjalan setiap kali Anda memicu aksi Git tertentu, jadi buatlah tetap ringan. Jika Anda memiliki rangkaian tes besar, jalankan di CI alih-alih pada hooks lokal untuk performa yang lebih baik. Menjalankan linter, formatter, atau pemeriksaan di seluruh repositori pada setiap commit akan memperlambat Anda, jadi batasi pemeriksaan pada file yang benar-benar berubah.
Pertahankan kompatibilitas lintas platform
Pastikan hooks Anda berjalan mulus di berbagai sistem operasi. Gunakan shebang portabel, tangani akhir baris secara konsisten (gunakan LF daripada CRLF), dan jangan hardcode path absolut.
Sebaliknya, andalkan
PATHdan skrip proyek lokal sepertinpm run lintataupython -magar dapat berjalan di berbagai lingkungan.Strategi debugging
Tambahkan logging yang rinci atau flag debug (misalnya,
HOOK_DEBUG=1) untuk melacak bagaimana skrip berjalan. Cetak detail seperti direktori saat ini, cabang, atau file yang di-stage. Ini memudahkan mengikuti alur eksekusi dan menemukan titik masalah.Uji hooks dengan input berbeda dan simulasi skenario kegagalan secara lokal sebelum mendorong perubahan. Jika hook memblokir progres secara tak terduga, Anda dapat melewatinya sementara dengan flag
--no-verifymilik Git atau dengan variabel lingkungan yang dirancang untuk melewati hooks.Untuk mempertahankan perilaku yang konsisten di berbagai sistem operasi, hindari perintah spesifik OS, dan pilih bahasa skrip yang portabel.
Dokumentasikan hooks dengan jelas
Dokumentasi yang baik meningkatkan pemahaman tim dan memudahkan onboarding anggota baru. Pertahankan README terpusat yang merinci tujuan, perilaku, dan penggunaan setiap hook. Sertakan cara menjalankan, prasyarat, pemecahan masalah, dan tips bypass. Juga, sediakan instruksi instalasi/penyiapan.
Teknik Implementasi Lanjutan dan Praktik Terbaik untuk Git Hooks
Jika Anda pengguna tingkat lanjut, tips ini bisa membantu:
Optimasi performa
Untuk mengoptimalkan performa dalam alur kerja yang kompleks, kurangi dependensi eksternal dengan menghindari pustaka berat. Ini menurunkan waktu startup dan mengurangi titik kegagalan.
Cache hasil proses mahal seperti linting sehingga Anda dapat menggunakannya kembali ketika file tidak berubah.
Jika hooks berisi banyak pemeriksaan, jalankan paralel agar berjalan bersamaan. Juga, modulerkan skrip hook. Artinya, strukturkan hooks sebagai komponen kecil yang dapat digunakan ulang yang hanya mengeksekusi bagian relevan berdasarkan konteks.
Hook chaining dan orkestrasi
Gunakan hook chaining untuk menjalankan beberapa hook pada satu peristiwa git. Misalnya, pada pre-commit hook, Anda mungkin ingin menjalankan linting, lalu tes, kemudian memformat kode, semuanya berantai. Setiap perintah berjalan satu demi satu, dan jika ada yang gagal (keluar dengan status non-zero), perintah berikutnya dapat dilewati untuk mencegah commit yang buruk.
Ketika aksi hook saling independen, Anda juga dapat menjalankannya secara paralel untuk menghemat waktu. Di sinilah Anda menggunakan orkestrasi untuk mengelola eksekusi tugas dalam urutan yang benar.
Manajemen konfigurasi
Setiap repo memiliki direktori
.git/hookssendiri. Artinya jika Anda menginginkan pemeriksaan yang sama (misalnya linting) di banyak proyek, Anda harus menyalinnya ke mana-mana. Cara yang lebih baik adalah mengelola hooks secara terpusat sehingga semua repositori dapat mengakses dan menjalankannya.Anda dapat melakukannya dengan satu perintah:
git config --global core.hooksPath ~/.githooks. Ini memberi tahu Git untuk mencari hooks di folder~/.githooks. Hook apa pun yang Anda buat di sana akan otomatis dibagikan ke semua repositori Anda.Anda juga dapat membuat logika hook lebih dinamis dengan file konfigurasi (JSON atau YAML). Alih-alih hardcode logika berbeda untuk tiap repositori, skrip hook Anda dapat membaca file konfigurasi repositori tersebut dan menerapkan aturan yang benar secara otomatis.
Eksekusi kondisional
Di dalam skrip hook, Anda dapat menambahkan kondisi sederhana agar hanya berjalan ketika relevan. Misalnya memeriksa nama cabang saat ini, melihat file mana yang benar-benar berubah, atau membaca variabel lingkungan yang memerintahkan untuk melewati eksekusi.
Jika Anda ingin kontrol lebih, gunakan kerangka kerja seperti pre-commit, di mana Anda mendeklarasikan di file konfigurasi hook mana yang berjalan pada tahap mana. Anda juga bisa menambahkan logika kondisional, seperti menjalankan hook hanya pada cabang tertentu, melewati hook dengan variabel, atau bahkan menambahkan kondisi berbasis waktu. Ini membuat skrip hook Anda dinamis dan selaras dengan alur kerja nyata.
Strategi kolaborasi dan berbagi
Ada dua cara Anda dapat memusatkan git hooks dan membagikannya di seluruh repositori dan tim:
Template Git
Saat Anda menginisialisasi repositori, Git menambahkan beberapa hook default di bawah direktori
git/hooks. Hook ini berasal dari template default Git.Untuk membuat hooks kustom secara terpusat, Anda dapat membuat direktori template Git, menulis hooks Anda di sana, dan mengatur Git secara global untuk menggunakan direktori baru ini sebagai template default.
Namun metode ini tidak memiliki kontrol versi untuk hooks. Ini terutama berguna jika hooks jarang berubah. Jika Anda sering memperbarui hooks dan memerlukan kontrol versi, gunakan metode berikutnya.
Repo git pusat
Buat repositori pusat khusus yang dikontrol versi dan simpan semua skrip hook kustom Anda di repo tersebut, terpisah dari repo proyek. Jadi Anda dapat memperbarui hooks secara independen dari basis kode proyek.
Hooks ini harus distandardisasi, artinya hindari hardcode path atau nilai yang terikat pada satu repositori.
Pengaturan ini sangat berguna untuk tim, karena semua orang dapat menarik pembaruan secara berkala dan menyinkronkannya ke proyek mereka.
Pendekatan yang lebih efisien adalah menggunakan skrip setup yang mengkloning repo hooks pusat dan menyalin skrip hook ke direktori
.git/hooksdi setiap proyek. Contoh skrip setup:Opsi lain adalah menggunakan symlink. Anda dapat menautkan direktori
.git/hookssetiap proyek ke skrip di repo hooks yang dikontrol versi. Jadi setiap kali Anda memperbarui repo pusat, hooks akan otomatis diperbarui karena symlink mengarah ke sana.Untuk menjaga sistem ini andal, siapkan proses yang jelas untuk memelihara hooks. Anggota tim harus mengusulkan perubahan hooks melalui pull request, merge hanya setelah ditinjau, dan menjaga dokumentasi tetap mutakhir seiring perkembangan hooks.
Mengintegrasikan Git Hooks dengan Alur Pengembangan
Git hooks berperan besar dalam continuous integration (CI). Secara umum, CI berarti sering menggabungkan perubahan, lalu menjalankan build dan tes untuk menemukan masalah lebih awal. Dengan menghubungkan hooks dengan alat CI/CD seperti Jenkins, GitHub Actions, atau GitLab CI, Anda dapat memicu build, menjalankan tes, dan bahkan menerapkan aplikasi secara otomatis berdasarkan peristiwa Git.
Sebagai contoh, server-side pre-receive hook menjalankan skrip kustom di server Git sebelum menerima push. Jika skrip gagal, server menolak push. Anda dapat menggunakannya untuk memeriksa apakah build CI terbaru pada cabang tersebut lolos sebelum mengizinkan push. Jalur CI itu mungkin mencakup pemeriksaan cakupan kode, uji unit atau integrasi, atau bahkan pemindaian keamanan.
Hooks juga dapat mengotomatiskan tugas deployment. Post-receive hook dapat memicu webhook yang memulai pipeline CI/CD. Ketika kode digabungkan ke main, siklus build → deploy → rilis akan berjalan otomatis.
Pertimbangan Keamanan dan Praktik Terbaik
Jika Anda memelihara hooks terpusat untuk mempermudah kolaborasi dan satu sumber kebenaran, pastikan direktori hooks memiliki izin file yang aman untuk mencegah akses tidak sah. Hanya pengguna tepercaya yang boleh memiliki akses tulis.
Selalu validasi input atau parameter yang diterima skrip hook Anda untuk menghindari serangan injeksi kode. Misalnya, validasi input terhadap pola ketat seperti hanya mengizinkan nama cabang dengan alfanumerik dan tanda hubung, atau tag yang cocok dengan
vMAJOR.MINOR.PATCH.Jangan pernah menaruh data sensitif secara hardcode di skrip hook. Gunakan variabel lingkungan atau alat manajemen rahasia khusus untuk memberikan kredensial secara aman saat runtime. Anda dapat mengintegrasikan alat seperti Gitleaks dengan pre-commit hook untuk menjalankan pemindaian keamanan terhadap informasi sensitif dalam perubahan yang akan Anda commit.
Seseorang dapat mengarahkan ulang hook Anda untuk mengirimkan kode atau informasi ke server lain. Jadi batasi domain mana yang dapat dijangkau oleh hooks Anda. Gunakan proxy atau firewall untuk memblokir server tujuan yang tidak dikenal. Juga, pastikan log Anda tidak menampilkan info rahasia dalam pesan tampilan.
Kesimpulan
Git hooks adalah cara yang kuat untuk mengotomatiskan tugas dan menegakkan standar langsung dalam alur kerja pengembangan Anda. Hooks membantu mulai dari gaya kode dan pengujian hingga deployment dan pemeriksaan keamanan.
Dengan menggunakannya dengan baik, Anda mengurangi kesalahan, menghemat waktu, dan membuat kolaborasi lintas tim lebih lancar.
Mulailah dengan pemeriksaan pre-commit sederhana, lalu coba pengaturan yang lebih lanjut seperti orkestrasi, manajemen terpusat, atau integrasi CI/CD. Jika Anda pengguna Git dan ingin mengembangkan keterampilan, lihat kursus Git tingkat lanjut ini.