Pesan commit dari berkas

Saya sedang perlu melakukan banyak commit (seperti biasa, dengan git) berbeda dimana saya ingin memasukkan pesan commit dari sebuah berkas. Kalau saya baca manual dari git-commit, sayangnya Git tidak memiliki fasilitas ini. Git hanya mendukung pemasukkan pesan melalui parameter -m yang saya rasa sangat terbatas atau dengan membuat berkas yg dapat dijadikan sebagai template dari pesan commit. Pembuatan berkas template mungkin mendekati apa yg saya inginkan namun tetap saja saya harus berhadapan dengan teks editor lalu harus menyimpan dan menutupnya sebelum Git dapat melakukan commit. Saya menginginkan semuanya dapat berjalan secara otomatis.

Lalu saya ingat kalau pada dasarnya saya bisa mengganti editor yang akan digunakan oleh Git untuk meminta pengguna memasukkan pesan commit. Pada saat melakukan commit, Git akan memanggil sebuah teks editor dan menunggu sampai teks editor itu ditutup. Berkas yang tadi dibuka oleh teks editor akan dibaca oleh Git lalu isinya dijadikan sebagai pesan commit. Mengatahui alur kerja ini, saya jadi berpikir mengapa tidak membuat teks editor “palsu” saja 😀

Teks editor yang digunakan oleh Git dapat diatur, antara lain, dengan mengatur nilai environment variabel EDITOR. Sebagai contoh, jika ingin menggunakan Gedit untuk menulis pesan commit, kita bisa melakukan hal berikut.

$ EDITOR=gedit git commit

Sebuah berkas bernama .git/COMMIT_EDITMSG akan dijadikan parameter saat teks editor tadi dipanggil sehingga berkas tersebut akan secara otomatis dibuka. Setelah teks editor ditutup, isi dari berkas tadi akan dibaca oleh Git dan dijadikan sebagai pesan commit. Kalau saya ingin membuat teks editor palsu, berarti yang saya harus lakukan adalah menulisi berkas yg diberikan oleh Git dengan pesan commit yang saya inginkan.

Sekitar 6 baris kemudian, akhirnya jadi juga sebuah skrip sederhana yang akan menjadi teks editor palsu. Berikut ini kodenya. Wait.. tunggu.. setelah dipikir2 lagi.. aplikasi sejenis itu sudah ada! aplikasi tersebut adalah.. jreng jreng jreng.. cp alias copy! hah?

Begini ceritanya.. saat git commit dipanggil, maka Git akan menjalankan hal berikut.

$EDITOR .git/COMMIT_EDITMSG

Jika nilai EDITOR adalah gedit, maka yang akan dijalankan oleh Git adalah gedit .git/COMMIT_EDITMSG yang akan meminta Gedit untuk membuka berkas .git/COMMIT_EDITMSG. Setelah aplikasi yg disebut di EDITOR dideteksi sudah ditutup, maka Git akan membaca berkas .git/COMMIT_EDITMSG dan menggunakannya (saya udah nulis yg seperti ini berapa kali ya?).

Kalau diteliti lebih lanjut, nilai EDITOR itu juga bisa mengandung parameter lain. Sebagai contoh, Gedit memiliki opsi --new-window yang kalau dipakai, maka berkas yang disebutkan akan dibuka di jendela Gedit baru, bukan sekedar di tab baru dari window yg sudah ada (asumsinya sudah ada window Gedit yg terbuka). Jika Gedit ingin dijalankan dengan opsi ini pada saat melakukan commit, maka yang berikut ini bisa dilakukan.

$ EDITOR="gedit --new-window" git commit

Apakah hal tersebut berlaku untuk opsi (yg dimulai dengan - atau --) apakah bisa parameter lain termasuk nama berkas? Ternyata bisa! Coba saja yg berikut ini.

$ EDITOR="gedit a b c" git commit

Maka selain .git/COMMIT_EDITMSG, berkas a, b, dan c juga akan dibuka oleh Gedit.

Nah, kembali ke cp, bagaimana kita bisa memanfaatkan cp untuk melakukan commit dengan pesan yg dibaca dari sebuah berkas? Jawabannya adalah dengan menjadikan cp sebagai EDITOR dan berkas tadi sebagai parameter pertamanya. Saat commit dipanggil, Git akan memasukkan parameter kedua dan mengeksekusinya. Alhasil, perintah yang dipanggil adalah salin berkas yg disebut ke .git/COMMIT_EDITMSG 😀

$ EDITOR="cp /tmp/berkas-berisi-pesan-commit.txt" git commit

Voila! git commit akan keluar seketika namun commit tetap sudah terjadi. Jika melihat log, isi berkas yg disebut akan menjadi pesan commit.

Lho? kok bisa? bisa karena teks editor akan dibuka oleh Git dengan melakukan perintah berikut.

cp /tmp/berkas-berisi-pesan-commit.txt .git/COMMIT_EDITMSG

Perintah tadi akan jalan sekejap dan Git akan otomatis mendeteksi kalau perintah cp sudah selesai dieksekusi. Isi .git/COMMIT_EDITMSG akan diasumsikan sudah berisi pesan commit sehingga bisa digunakan oleh Git 😀

Leave a Reply