{"id":10734,"date":"2022-07-05T13:28:15","date_gmt":"2022-07-05T06:28:15","guid":{"rendered":"https:\/\/www.jetorbit.com\/blog\/?p=10734"},"modified":"2022-07-11T10:46:15","modified_gmt":"2022-07-11T03:46:15","slug":"pengertian-git-hooks-dan-cara-menggunakannya","status":"publish","type":"post","link":"https:\/\/www.jetorbit.com\/blog\/pengertian-git-hooks-dan-cara-menggunakannya\/","title":{"rendered":"Pengertian Git Hooks dan Cara Menggunakannya"},"content":{"rendered":"<p>Siapa nih yang belum tahu sama sekali tentang Git hooks? Git hooks adalah skrip shell yang berjalan secara otomatis sebelum atau setelah Git menjalankan perintah penting, seperti Commit atau Push. Agar Hook berfungsi, kalian perlu memberikan izin eksekusi kepada sistem Unix. Bingung? Tenang, kami akan membahas Git hooks spesial untuk kalian. Simak sampai tuntas yuk <strong>Pengertian Git Hooks dan Cara Menggunakannya<\/strong><\/p>\n<p>Git telah menjadi elemen penting bagi <em>developer, programmer,<\/em> dan <em>engineer software<\/em> untuk memantau perubahan pada <em>project <\/em>agar kolaborasi mereka menjadi lebih efisien. Git hooks merupakan salah satu fitur bawaan Git, yang memungkinkan <em>user <\/em>mengotomatiskan tindakan kustom setiap kali terjadi peristiwa tertentu.<\/p>\n<h2><strong>Pengertian Git<\/strong><\/h2>\n<p>Git adalah aplikasi <em>version control<\/em> <em>open-source<\/em>. Dengan Git, <em>user <\/em>bisa memantau dan melacak proses pengembangan <em>software <\/em>secara mendetail. Kalian bisa membuat branch pengembangan, mencatat perubahan, dan sepenuhnya mengontrol versi file <em>project <\/em>kalian.<\/p>\n<p>Git sangat populer di kalangan <em>software developer <\/em>dan sering digunakan pada berbagai <em>project open-source<\/em>.<\/p>\n<h2><strong>Pengertian Git Hooks<\/strong><\/h2>\n<p>Git hooks adalah skrip yang berjalan otomatis, sebelum atau setelah menjalankan command Git, seperti Commit dan Push. Dengan skrip ini, <em>user <\/em>bisa menyesuaikan perilaku internal Git dengan mengotomatiskan tindakan tertentu pada tingkat program dan <em>deployment<\/em>.<\/p>\n<p>Beberapa manfaat implementasi Git hooks adalah alur kerja integrasi yang berkelanjutan, mematuhi kebijakan commit, dan mencegah tindakan yang tidak sesuai dengan standar yang telah ditetapkan.<\/p>\n<p>Git menyertakan contoh-contoh hooks di repositori Git tertentu. Namun, website seperti <a href=\"https:\/\/www.jetorbit.com\/blog\/cara-menggunakan-github-dan-perintah-dasar-github\/\">GitHub<\/a> atau GitLab tidak mengizinkan penggunaan Git hooks di <em>instance <\/em>pertamanya. Inilah sebabnya Git hooks biasanya digunakan di <em>instance <\/em>lokal atau pribadi.<\/p>\n<p>Ingat ya, sistem harus memiliki izin eksekusi untuk menjalankan setiap hook tertentu.<\/p>\n<h2><strong>Cara Menggunakan Git Hooks<\/strong><\/h2>\n<p>Skrip hook disimpan di direktori <strong>.git\/hooks\/<\/strong>. Dengan fitur template directory dari Git, <em>user <\/em>bisa menginstalnya secara otomatis. Setiap kali kalian menggunakan \u201cgit init\u201d atau \u201cgit clone\u201d, semua file dan direktori dalam template directory tersebut akan disalin ke repositori Git kosong yang baru.<\/p>\n<p>Dalam <strong>.git\/hooks\/<\/strong>, kalian akan menemukan sekumpulan sampel hooks, seperti <strong>commit-msg.sample<\/strong>, <strong>post-update.sample<\/strong>, dan <strong>pre-commit.sample<\/strong>, yang dapat membantu kalian memulai dengan lebih mudah.<\/p>\n<p>Untuk menginstal hooks, kalian perlu membuat file yang bisa dieksekusi (<em>executable<\/em>) dan menyimpannya dalam direktori <strong>.git\/hooks\/<\/strong>.<\/p>\n<h2><strong>Cara Menggunakan Local Hooks<\/strong><\/h2>\n<p>Local Hooks atau sisi klien (<em>client-side<\/em>) dipicu oleh peristiwa yang dijalankan di komputer pengguna. Contoh peristiwa ini di antaranya adalah saat menjalankan atau menggabungkan <em>project<\/em>.<\/p>\n<p>Secara umum ada 3 jenis <em>local hooks<\/em> atau sisi klien, yaitu:<\/p>\n<ul>\n<li><strong>Committing-workflow hooks. <\/strong>Skrip hook ini berkaitan dengan proses comitting, yaitu <strong>pre-commit<\/strong>, <strong>prepare-commit-msg<\/strong>,<strong> commit-msg<\/strong>, dan <strong>post-commit<\/strong>.<\/li>\n<li><strong>Email workflow hooks. <\/strong>Skrip hook ini digunakan untuk project dengan alur kerja berbasis email yang menggunakan command \u201cgit am\u201d. Skrip ini meliputi <strong>applypatch-msg<\/strong>, <strong>pre-applypatch<\/strong>, dan <strong>post-applypatch<\/strong>.<\/li>\n<li><strong>Lainnya.<\/strong> Skrip hook jenis ini di antaranya adalah <strong>pre-rebase<\/strong>, <strong>post-rewrite<\/strong>, <strong>post-checkout<\/strong>,<strong> post-merge<\/strong>, <strong>pre-push<\/strong>, dan <strong>pre-auto-gc<\/strong>.<\/li>\n<\/ul>\n<p>Berikut ini cara install git hook:<\/p>\n<ol>\n<li>Buka direktori <strong>.git\/hooks\/ <\/strong>milik repositori kalian.<\/li>\n<li>Cari sampel file hook yang ingin digunakan.<\/li>\n<li>Hapus kata \u201c.sample\u201d dari nama file hook. Misalnya, \u201cpre-commit.sample\u201d harus diubah menjadi \u201cpre-commit\u201d.<\/li>\n<li>Pastikan hook bisa dieksekusi dengan mengubah izinnya menggunakan command Git berikut:<\/li>\n<\/ol>\n<p>chmod +x [hook-name]<\/p>\n<p>5. Pilih bahasa skrip yang ingin digunakan untuk hook tersebut. Kalian bebas menggunakan bahasa skrip manapun, termasuk Python, Bash, atau shell.<\/p>\n<p>6. Buka file hook di program code editor dan tentukan bahasa skrip pilihan kalian. Sertakan path interpreter di command.<\/p>\n<p>Kalau ingin menggunakan <a href=\"https:\/\/www.python.org\/\" target=\"_blank\" rel=\"noopener\"><strong>Python<\/strong><\/a>:<\/p>\n<p>#!\/usr\/bin python<\/p>\n<p>Apabila ingin menggunakan <strong>Bash<\/strong>:<\/p>\n<p>#!\/bin\/bash<\/p>\n<p>Untuk menggunakan <strong>shell<\/strong>:<\/p>\n<p>#!\/bin\/sh<\/p>\n<p>7. Tulis skrip hook dalam bahasa skrip yang sudah dipilih.<\/p>\n<p>Ingat, agar hook berjalan dengan benar, nilai exit harus 0. Kalau ingin gagal, nilai exit harus 1. Apabila kalian ingin menambahkan beberapa ketentuan, semuanya harus disertakan dalam file yang sama.<\/p>\n<p>Jangan lupa, skrip hook tidak langsung bisa digunakan dengan kontrol versi Git. Artinya, skrip tersebut tidak bisa dijalankan. Kalau direktori local hook dihapus, Git akan menghapus total semua hook dan versi sebelumnya dari project.<\/p>\n<p>Solusinya yaitu dengan menambahkan symlink (symbolic link) ke repositori Git. Dengan begitu, skrip hook yang diaktifkan bisa dijalankan dalam aplikasi kontrol versi tersebut.<\/p>\n<p>Berikut cara melakukannya:<\/p>\n<ol>\n<li>Buat direktori Git baru bernama \u201chooks\u201d di <em>project <\/em>utama kalian.<\/li>\n<li>Copy-paste file hook dari <strong>.git\/hooks\/<\/strong> ke direktori \u201chooks\u201d yang baru. Kalau masih berupa sampel, ubah menjadi executable dengan menghapus kata \u201c.sample\u201d dari nama file.<\/li>\n<li>Buka <strong>.git\/hooks\/<\/strong> dan buat file kosong baru dengan nama yang sama.<\/li>\n<li>Buat symlink baru dengan memasukkan command berikut ke dalam Git:<\/li>\n<\/ol>\n<p>ln -s -f ..\/hooks\/[hook-name] .git\/hooks\/[hook-name]<\/p>\n<p>Selain itu, jika kalian ingin bypass hook aktif, tambahkan \u201c\u2013no-verify\u201d ke command yang relevan. Misalnya, masukkan command berikut untuk melewati hook commit:<\/p>\n<p>git commit &#8211;no-verify -m [commit message]<\/p>\n<h3><strong>Menggunakan Pre-Hooks<\/strong><\/h3>\n<p>Pre-hook dieksekusi sebelum peristiwa tertentu di repositori Git.<\/p>\n<p>Hook pre-commit, misalnya, bisa digunakan untuk memberlakukan kebijakan commit dan mencegah commit yang tidak benar. Kalau hook exit dengan status selain nol (non-zero), Git akan membatalkannya.<\/p>\n<p>Berikut beberapa contoh pre-hook lokal:<\/p>\n<ul>\n<li><strong>pre-applypatch.<\/strong> Mengecek kondisi <em>working tree<\/em> (direktori kerja) sebelum menjalankan perubahan. Pre-hook ini dipanggil setelah versi baru diterapkan tapi sebelum perubahan dijalankan.<\/li>\n<li><strong>pre-commit.<\/strong> Menginspeksi konten commit itu sendiri, seperti gaya kode atau trailing whitespace. Pre-hook ini dipanggil sebelum pesan commit ditulis.<\/li>\n<li><strong>pre-merge-commit.<\/strong> Memanggil commit gabung otomatis yang diminta oleh \u201cgit merge\u201d. Pre-hook ini dipanggil setelah penggabungan tapi sebelum mendapatkan file pesan commit yang diajukan.<\/li>\n<li><strong>pre-push.<\/strong> Memvalidasi serangkaian update ref sebelum push terjadi. Pre-hook ini berjalan selama \u201cgit push\u201d setelah remote ref diupdate tapi sebelum perubahan baru ditransfer.<\/li>\n<li><strong>pre-rebase.<\/strong> Melarang pembuatan ulang base (rebase) commit Git apapun yang telah di-push. Pre-hook ini dipanggil sebelum \u201cgit rebase\u201d terjadi.<\/li>\n<\/ul>\n<p>Beberapa hook ini mungkin terlihat mirip ya, misalnya skrip pre-push dan pre-commit. Oleh karena itu, penting untuk mengetahui hook mana yang nantinya sesuai untuk memenuhi kebutuhan kalian.<\/p>\n<p>Skrip pre-commit akan berjalan sebelum kalian mengetik pesan commit, sementara pre-push berjalan sebelum konten baru diupload ke repositori jarak jauh. Keduanya memiliki fungsi yang berbeda dalam siklus project tapi kalian bisa menggunakannya untuk mencegah commit dan push yang salah agar workflow semakin baik.<\/p>\n<h3><strong>Menggunakan Post-Hooks<\/strong><\/h3>\n<p>Git menjalankan post-hook setelah peristiwa tertentu terjadi di repositori.<\/p>\n<p>Post-hook sering digunakan untuk mengotomatiskan respons terhadap tindakan lainnya. Misalnya, pengiriman email notifikasi saat commit Git baru ditambahkan.<\/p>\n<p>Berikut beberapa contoh post-hook lokal:<\/p>\n<ul>\n<li><strong>post-applypatch. <\/strong>Memberi tahu grup atau patch author setelah patch diterapkan. Post-hook ini dipanggil setelah versi barunya diterapkan dan di-commit.<\/li>\n<li><strong>post-commit. <\/strong>Membuat notifikasi setelah seluruh proses commit selesai.<\/li>\n<li><strong>post-checkout.<\/strong> Memastikan kondisi, menampilkan perbedaan, dan menyiapkan direktori kerja yang tepat untuk lingkungan project. Post-hook ini berjalan setelah \u201cgit checkout\u201d berhasil selesai.<\/li>\n<li><strong>post-merge.<\/strong> Menyimpan, menerapkan izin, dan memulihkan data tak terlacak lainnya di working tree. Post-hook ini dipanggil setelah command \u201cgit merge\u201d berhasil dijalankan.<\/li>\n<li><strong>post-rewrite.<\/strong> Bisa digunakan dalam cara yang serupa dengan hook post-checkout dan post-merge. Post-hook ini dijalankan oleh command Git yang menggantikan commit, seperti \u201cgit rebase\u201d.<\/li>\n<\/ul>\n<h2><strong>Cara Menggunakan Server-Side Hook<\/strong><\/h2>\n<p>Skrip hook sisi server (<em>server-side<\/em>) dieksekusi di repositori atau server remote yang menerima push dari komputer lokal. Skrip ini bisa berjalan sebelum ataupun setelah push server. Pre-hook sisi server, misalnya, bisa membatalkan push Git apa pun yang exit dengan pesan selain nol.<\/p>\n<p><strong>Berikut beberapa contoh server-side hook:<\/strong><\/p>\n<ul>\n<li><strong>pre-receive. <\/strong>Mencantumkan referensi yang di-push ke repositori jarak jauh. Hook ini bisa digunakan untuk memastikan bahwa tidak ada referensi terbaru yang non-fast-forward atau untuk melakukan kontrol akses bagi semua ref dan file yang diubah dengan Git push.<\/li>\n<li><strong>update.<\/strong> Memiliki tujuan yang serupa dengan pre-receive. Satu-satunya perbedaan adalah hook ini dijalankan satu kali untuk tiap branch sedangkan pre-receive bisa berjalan sekali untuk beberapa branch.<\/li>\n<li><strong>post-receive.<\/strong> Mengirim email berisi daftar, memberi tahu server integrasi berkelanjutan, atau mengupdate sistem pelacakan tiket. Hook ini dijalankan di remote server selama push, setelah semua referensi diupdate.<\/li>\n<li><strong>post-update.<\/strong> Menerapkan notifikasi untuk referensi yang di-push. Cara kerjanya mirip dengan post-receive. Bedanya hanyalah hook ini tidak menerima nilai ref lama ataupun baru. Hook ini berjalan setelah semua ref di-push ke remote server.<\/li>\n<\/ul>\n<p>Langkah-langkah menginstal hook sisi server sama dengan langkah penginstalan hook sisi klien. Satu-satunya perbedaan adalah kalian harus menempatkan skrip ke dalam direktori .git\/hooks yang ada di server jarak jauh, bukan di direktori lokal.<\/p>\n<h2><strong>Contoh Git Hook<\/strong><\/h2>\n<p>Ada banyak kasus penggunaan untuk skrip hook. Okay, kita lihat contoh-contohnya yuk.<\/p>\n<h3><strong>Menampilkan Informasi tentang Commit Action<\/strong><\/h3>\n<p>Contoh ini menunjukkan informasi tindakan commit Git. Hook ini dipanggil setelah menerima pesan commit default dan sebelum editor pesan commit dibuka.<\/p>\n<p>Buat file bernama prepare-commit-msg di folder <strong>.git\/hooks\/<\/strong> repositori Git lalu tulis skrip berikut:<\/p>\n<p>#!\/bin\/sh<\/p>\n<p>SOB=$(git config github.user)<\/p>\n<p>grep -qs &#8220;^$SOB&#8221; &#8220;$1&#8221; || echo &#8220;. Cambio por @$SOB&#8221; &gt;&gt; &#8220;$1&#8221;<\/p>\n<p>Setelah selesai, simpan dan tetapkan izin eksekusi ke file.:<\/p>\n<p>:~$ chmod +x prepare-commit-msg<\/p>\n<p>Dengan hook sederhana ini, kita akan langsung menerima informasi yang relevan terkait tindakan commit saat dibuat.<\/p>\n<h3><strong>Membuat Dokumentasi Saat Perubahan Diupload<\/strong><\/h3>\n<p>Pre-push hook memungkinkan pembuatan dokumentasi kode apabila kita memiliki generator kode. Setiap kali kita melakukan perubahan, dokumentasi akan dikompilasi secara otomatis.<\/p>\n<p>Buat pre-push hook di direktori Git seperti tadi, kemudian tambahkan skrip berikut:<\/p>\n<p>#!\/bin\/bash<\/p>\n<p>doxygen Doxyfile<\/p>\n<p>git add docs\/<\/p>\n<p>git commit -m &#8220;Update documentation ($(date +%F@%R))&#8221;<\/p>\n<p>Simpan file dan tetapkan izin eksekusinya:<\/p>\n<p>:~$ chmod +x pre-push<\/p>\n<h3><strong>Menemukan dan Memperbaiki Trailing Whitespace di Commit<\/strong><\/h3>\n<p>Pre-commit hook bisa dibuat tanpa perlu ribet. Buat file bernama pre-commit dan tambahkan skrip berikut ke dalamnya:<\/p>\n<p>#!\/bin\/bash -l<\/p>\n<p>.git\/hooks\/pre-commit-master-no-no<\/p>\n<p>if [[ $? == 1 ]]<\/p>\n<p>then<\/p>\n<p>exit 1<\/p>\n<p>fi<\/p>\n<p>.git\/hooks\/pre-commit-debugger<\/p>\n<p>.git\/hooks\/pre-commit-trailing-spaces<\/p>\n<p>.git\/hooks\/pre-commit-images<\/p>\n<p>.git\/hooks\/pre-commit-pair<\/p>\n<p>Setelah itu, trailing whitespace akan ditemukan dan diperbaiki di semua commit.<\/p>\n<p>Okay, sekarang udah tahu kan apa itu Git hooks serta cara menggunakan local hook dan server-side? Git hooks memang banyak membantu <em>developer<\/em>, <em>programmer<\/em>, dan <em>engineer software<\/em> untuk mengotomatiskan tindakan kustom setiap kali peristiwa tertentu terjadi di repositori Git. Trus ada beberapa contoh Git hooks dan cara menginstalnya juga. Semoga bermanfaat ya dan selamat belajar!<\/p>\n<p>Oia, Jetorbit punya<a href=\"https:\/\/www.jetorbit.com\/jasa-website-toko-online\/\"> Paket Website Toko Online<\/a>, lho. Kalian bisa menjual apa saja dengan toko online milik kalian sendiri! Mudah digunakan oleh siapa saja yang tentunya disertai dengan dukungan bantuan terbaik yang kalian dapatkan. Tenang, kami juga menyediakan produk VPS yang bisa kalian gunakan sesuai kebutuhan kalian tentunya.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Siapa nih yang belum tahu sama sekali tentang Git hooks? Git hooks adalah skrip shell yang berjalan secara otomatis sebelum atau setelah Git menjalankan perintah penting, seperti Commit atau Push. Agar Hook berfungsi, kalian perlu memberikan izin eksekusi kepada sistem Unix. Bingung? Tenang, kami akan membahas Git hooks spesial untuk kalian. Simak sampai tuntas yuk &#8230; <a title=\"Pengertian Git Hooks dan Cara Menggunakannya\" class=\"read-more\" href=\"https:\/\/www.jetorbit.com\/blog\/pengertian-git-hooks-dan-cara-menggunakannya\/\" aria-label=\"Read more about Pengertian Git Hooks dan Cara Menggunakannya\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":11085,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"generate_page_header":"","footnotes":""},"categories":[25],"tags":[3337,283,3329,3331,7,3332,3333,3330,3335,3334,3336],"class_list":["post-10734","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-info","tag-contoh-git-hook","tag-domain-murah","tag-git-hooks","tag-git-hooks-adalah","tag-hosting-murah","tag-menggunakan-git-hooks","tag-menggunakan-local-hooks","tag-pengertian-git","tag-post-hoks","tag-pre-hooks","tag-server-hide-hook","infinite-scroll-item","generate-columns","tablet-grid-50","mobile-grid-100","grid-parent","grid-33"],"_links":{"self":[{"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/posts\/10734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/comments?post=10734"}],"version-history":[{"count":2,"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/posts\/10734\/revisions"}],"predecessor-version":[{"id":10976,"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/posts\/10734\/revisions\/10976"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/media\/11085"}],"wp:attachment":[{"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/media?parent=10734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/categories?post=10734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jetorbit.com\/blog\/wp-json\/wp\/v2\/tags?post=10734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}