Automasi dengan Git Hooks

Setiap pekerjaan yang dilakukan berulang-ulang adalah kandidat yang cocok untuk automasi. Termasuk ketika kita bekerja dengan Git, rutinitas yang dilakukan setelah menjalankan salah satu perintah Git adalah kandidat yang cocok untuk diotomasi guna meningkatkan produktivitas kita. Untuk keperluan itu, Git menyediakan utilitas yang sangat berguna, yaitu Git Hooks.

Git Hooks

Git Hooks adalah script yang dieksekusi oleh Git pada event-event tertentu dalam workflow Git. Terdapat banyak event yang dapat kita tempelkan script pada Git. Daftar penjelasan lengkapnya bisa didapat di sini.

Cara menggunakannya cukup sederhana, cukup buat script yang dapat dijalankan di mesin kita kemudian simpan di direktori .git/hooks/ repositori kita dengan nama yang sesuai. Jangan lupa buat agar script tersebut executable (sudo chmod +x script.sh). Berikut isi dari direktori .git/hooks/ yang berisi berkas-berkas script contoh:

Git menjalankan script-script tersebut dengan memanggil namanya, oleh karena itu kita perlu mendeklarasikan interpreter yang harus digunakan untuk mengeksekusi script tersebut dengan menggunakan notasi shebang, misalnya #!/bin/bash untuk menggunakan bash. Hal ini membuat kita dapat menggunakan berbagai macam bahasa untuk menulis hook script kita: Javascript, Perl, Python, Ruby, dan lain-lain, selama interpreter untuk bahasa tersebut sudah ter-install di mesin kita.

Berikut adalah contoh script untuk hook pre-commit yang ditulis dengan bash. Script ini bertujuan mencetak branch yang sedang kita checkout sekarang, yang dilanjutkan dengan pilihan untuk lanjut melakukan commit atau batal. Tujuannya sekadar mengingatkan agar tidak salah branch saja.

#!/bin/bash

branch=$(git rev-parse --abbrev-ref HEAD)

printf "Sedang di branch \e[33m$branch\e[0m\n"
echo "Lanjutkan commit?"
select yn in "Ya" "Tidak"; do
    case $yn in
        Ya ) exit 0; break;;
        Tidak ) exit 1;;
    esac
done

Disebutkan di dokumentasi bahwa hook pre-commit akan membatalkan commit jika exit code dari script yang kita jalankan bukan 0. Maka dari itu, pada bash script di atas, ketika pengguna memilih Ya, proses commit akan lanjut berjalan, sebaliknya jika pengguna memilih Tidak. Jika suatu ketika kita perlu untuk menonaktifkan (mem-bypass) hook ini, kita dapat menggunakan flag --no-verify ketika mengeksekusi commit: git commit --no-verify.

Karena Git Hooks pada dasarnya sebatas menjalankan script pada mesin kita, apa yang dapat dilakukan olehnya menjadi hanya terbatas oleh imajinasi kita. Contoh pada tulisan ini baru melingkupi pre-commit, salah satu dari banyak hooks yang disediakan oleh Git.

Anda bisa bayangkan betapa powerful-nya fitur Git Hooks ini untuk automasi: Ingin menjalankan linter setiap sebelum commit? Ingin menambahkan isi pesan commit secara otomatis? Atau ingin menyalin working directory kita setiap setelah commit? Silakan bayangkan, rencanakan dan buat sendiri hook Anda!