Artikel ini menjelaskan sistem manajemen (organisasi, sinkronisasi, backup) data berbasis git di Linux yang digunakan oleh penulis. Dengan sistem ini, bekerja di beberapa komputer dan netbook terpisah secara offline menjadi lebih mudah.

 

Tentang git

Git adalah sistem kendali kode sumber (revision control system, atau version control system, atau VCS). Git pertama kali didesain dan dikoding oleh Bapak Linux sendiri, Linus Torvalds, tahun 2005 untuk menggantikan VCS komersial BitKeeper yang kala itu digunakan untuk mengatur kode sumber Linux. Karena tidak menemukan sistem lain yang lebih cepat untuk menangani kode sebesar kernel Linux, maka Linus menulis VCS sendiri. Karenanya, salah satu fitur utama git sejak awal adalah kecepatannya. Berbeda dari sistem kode sumber yang sudah terlebih dulu popular sebelumnya yaitu CVS dan Subversion, git tidak bersifat tersentralisasi melainkan terdistribusi. Artinya, setiap pengembang tidak hanya menyimpan working copy di komputer lokalnya, tapi juga menyimpan repositori, yang berisi sejarah lengkap perubahan. Sementara di sistem tersentralisasi, hanya ada satu repositori tunggal (umumnya di server yang dapat diakses oleh semua pengembang lewat jaringan).

Karena masing-masing pengembang memiliki repositori, maka komit dapat dilakukan secara offline di repositori lokal di komputer sendiri, tidak harus terhubung ke repositori sentral di jaringan. Saat ingin bertukar/mensinkronisasi hasil kerja dengan pengembang lainlah, baru kita terkonek ke jaringan dan melakukan merging atau patching.

Sistem manajemen data berbasis git

Git tidak hanya bisa digunakan oleh pemrogram untuk mengatur kode sumber program, melainkan juga oleh “pemakai biasa” untuk mengatur berbagai jenis data lain. Karena kecepatannya, tingkat kompresi/kompaksitas data yang bagus (dibandingkan VCS lain), akses mudah menggunakan command line (tidak harus client/server), dan penyimpanan yang murni berbasis file (tidak menggunakan sistem database/SQL) maka git popular dijadikan basis untuk sistem backup, contohnya oleh program gibakbupeigenclass.

Pada artikel ini, penulis akan menjelaskan sistem sendiri berbasis git yang sudah digunakan sekitar hampir setahun terakhir ini, untuk menyimpan semua data pribadi di komputer (terkecuali data biner yang besar-besar seperti file video/musik dan program/imej CD/DVD). Sistem ini cukup sederhana, hanya menggunakan git dan beberapa skrip Perl yang pendek. Dapat Anda adopsi atau jadikan dasar untuk mengembangkan sistem sendiri.

Persyaratan

Artikel ini mengasumsikan Anda sudah familiar dengan dasar-dasar penggunaan VCS (contohnya CVS atau Subversion), juga cukup nyaman bekerja lewat shell command line. Jika belum, ada banyak artikel tutorial di web/majalah yang dapat Anda jadikan acuan terlebih dulu. Anda juga bisa melihat manpage gittutorial yang memaparkan dasar-dasar penggunaan git.

Sistem Linux yang Anda pakai juga sudah harus diinstali git (di Debian/Ubuntu ini dapat dilakukan dengan perintah sudo aptitude install git atau sudo apt-get install git-all). Semua distro modern seharusnya sudah menyediakan paket git.

Skrip-skrip Perl yang diberikan di artikel ini membutuhkan beberapa modul CPAN (dapat dilihat di baris-baris awal skrip yang diawali perintah use). Semua modul yang dibutuhkan dapat diinstal menggunakan perintah cpan lalu mengetikkan notest install NAMA_MODULE atau install NAMA_MODUL. Jika Anda mengalami kesulitan menjalankan skrip Perl atau menginstal modul CPAN, silakan menghubungi penulis. Anda juga bisa bertanya ke milis id-perl@yahoogroups.com, http://groups.yahoo.gom/group/id-perl.

Setelah Anda mengundah skrip-skrip Perl yang diperlukan (lihat bagian Link), lakukan chmod +x dan taruhlah di lokasi yang tercantum dalam PATH Anda (misalnya di /usr/bin, atau di ~/bin jika direktori itu tercantum dalam PATH).

Latar belakang/kebutuhan

Saya bekerja di dua komputer/netbook atau lebih. Ada komputer desktop kantor, lalu netbook yang sering dibawa-bawa keluar kota/rumah, serta komputer desktop rumah (walau sebenernya saat ini saya jarang memakai desktop di rumah). Di kemudian hari bisa saja jumlah device bertambah, karena kehadiran ponsel pintar/nettop/smartbook/entah apa lagi yang berbasis Linux.

Kadang-kadang saya lupa membawa netbook ke kantor, tapi ingin tetap bisa bekerja mengerjakan dokumen dan proyek-proyek pemrograman. Ketika kembali ke rumah, saya ingin bisa mentransfer pekerjaan dari kantor.

Namun, kadang-kadang saya juga lupa (atau malas) melakukan sinkronisasi. Sepulang dari rumah, saya kadang mengerjakan proyek yang sama (walaupun untuk hal yang berbeda). Selama bekerja dengan netbook di rumah/mal/dsb, saya tidak selalu bisa terhubung dengan komputer/server kantor. Dengan demikian, saya telah melakukan perubahan di dua atau lebih kopi data di tempat yang berbeda.

Data yang saya miliki juga kebanyakan berbentuk teks (kode sumber program, catatan/jurnal berbentuk .txt, file-file konfigurasi, dsb).

Kondisi-kondisi ini ideal untuk menggunakan VCS terdistribusi macam git.

Prinsip pengaturan

Data disimpan dalam beberapa repositori git, masing-masing repositori per projek. Contohnya saya memiliki repositori notes untuk menyimpan jurnal/catatan, settings untuk menyimpan berbagai setting sistem seperti key SSH, konfigurasi emacs, histori shell, dll. Repositori web untuk menyimpan file-file HTML, gambar, dan skrip untuk website pribadi. Ada juga repositori-repositori berprefiks perl-, misalnya perl-Data-Schemaperl-Language-Finance-Bank-ID-BCA untuk tiap proyek open source yang saya miliki. Selain itu terdapat repositori untuk urusan kantor (umumnya berisi file-file spreadsheet dan dokumen OpenOffice), dll. Saat ini total repositori git yang saya buat ada sekitar 60.

Semua repositori ini disimpan di sebuah direktori di bawah home, katakanlah di ~/repos. Banyak pengguna git yang membuat seluruh home direktorinya sebagai sebuah repositori tunggal, namun saya kurang menyukai cara ini dan lebih cenderung membuat banyak repositori kecil-kecil per proyek karena: 1) lebih mudah mempertukarkan data (misalnya: tiap repositori proyek open source Perl bisa saya unggah ke github.com dan dibagikan dengan pengembang lain, sementara repositori kantor hanya dibagikan dengan sesama staf kantor lain); 2) lebih cepat dalam sinkronisasi (tidak perlu tiap kali sinkronisasi semua data); 3) lebih mudah memeriksa histori (antarproyek tidak bercampur) dan histori juga lebih pendek; dan 4) tidak semua data di home ingin saya masukkan ke VCS, file-file hasil unduh seperti program atau musik/video, atau file-file log/backup, tidak perlu dilacak historinya dengan VCS maupun disinkronisasi dengan komputer lain.

Beberapa konfigurasi sistem Linux tentu saja harus ditaruh di lokasi spesifik. Karena itu, ~/.emacs saya jadikan link simbolik ke ~/repos/settings/.emacs. Demikian juga banyak file konfigurasi lain yang ingin saya bawa ke mana-mana. Untuk histori shell, agar tidak selalu konflik saat sinkronisasi, saya memiliki .bash_history-pc dan .bash_history-netbook yang saya link ke ~/.bash_history.

Membuat

Pertama-tama buatlah direktori repos:

$ mkdir ~/repos
$ cd ~/repos

Lalu untuk tiap proyek, buatlah atau taruhlah repositori git di bawah direktori ini. Contoh, di bawah saya membuat 3 repositori notesweb, dan settingsnotes kosong, sementara web saya isi file-file yang dikopi dari /var/www/, dan settings saya isi dengan memindahkan beberapa file konfigurasi yang ada sebelumnya.

$ mkdir notes
$ cd notes
$ git init
$ cd ..
$ mkdir web
$ cd web
$ git init
$ cp -va /var/www/* .
$ git add .
$ git commit -am "impor pertama kali"
$ cd ..
$ mkdir settings
$ cd settings
$ git init
$ mv ~/.emacs .
$ mv ~/.emacs.d .
$ mv ~/.ssh .
$ mv ~/.mplayer .
$ mv ~/.bash_history .bash_history-pc
$ git add .emacs .emacs.d .ssh .mplayer .bash_history-pc
$ git commit -am "impor pertama kali"
$ cd
$ ln -s repos/settings/.emacs .
$ ln -s repos/settings/.emacs.d .
$ ln -s repos/settings/.mplayer .
$ ln -s repos/settings/.ssh .
$ ln -s repos/settings/.bash_history-pc .bash_history

Kini, setiap kali bekerja membuat perubahan/penambahan/penghapusan, jangan lupa untuk secara teratur melakukan komit untuk merekam sejarahnya dengan git. Contoh, saya ingin menambahkan file .gitignore:

$ cd ~/repos/web
$ echo '*~' > .gitignore
$ git add .gitignore
$ git commit -am "menambah .gitignore"
$ cd ~/repos/notes
$ echo '*~' > .gitignore
$ git add .gitignore
$ git commit -am "menambah .gitignore"
$ cd ~/repos/settings
$ echo '*~'                       > .gitignore
$ echo '.ssh/known_hosts'        >> .gitignore
$ echo '.emacs.d/auto-save-list' >> .gitignore
$ git add .gitignore
$ git commit -am "menambah .gitignore"

Contoh lain, menghapus/mengganti/menyunting file HTML:

$ cd ~/repos/web
$ git mv november.html nopember.html; # rename
$ git rm -r gambar2009              ; # rm saja juga boleh
$ emacs index.html                  ; # edit file
$ git commit -am "ganti nama file, buang gambar tahun lalu"

Untuk melihat sejarah perubahan, Anda dapat menggunakan “git log”. Untuk mengembalikan sebuah file yang salah sunting ke versi terkomit terakhir, gunakan “git checkout NAMAFILE”. Silakan lihat manual git untuk semua perintah-perintah lain (yang mana jumlahnya banyak!).

Sinkronisasi antarkomputer

Dengan menyimpan semua repositori di lokasi yang tertentu, kini mudah melakukan otomasi untuk sinkronisasi/backup/dsb untuk seluruh repositori kita.

Terlebih dulu installah aplikasi Perl Git::Bunch dari CPAN. Caranya (jika Anda belum memiliki cpanm):

$ curl -L http://cpanmin.us/ | perl - --sudo App::cpanminus

Setelah itu:

$ cpanm Git::Bunch

Setelah itu:

$ VERBOSE=1 gitbunch sync ~/repos /path/tujuan

Perintah “gitbunch sync” berguna untuk mensinkronisasikan semua repositori git yang ada di bawah ~/repos ke tempat lain (/path/tujuan bisa lokal bisa juga hasil mount ke laptop atau server). Pada intinya, yang dilakukan adalah melakukan “git pull” untuk setiap branch dari setiap repositori. Jika di lokasi tujuan repositori belum ada, terlebih dulu dikopi dengan rsync. Jika di repositori tujuan branch belum ada, akan dibuat dulu dengan “git branch NAMABRANCH”.

Untuk mensinkronisasikan pekerjaan dari netbook ke PC misalnya, yang saya lakukan biasanya adalah melakukan mount dengan sshfs di netbook:

$ sshfs steven@pc: /media/pc
$ VERBOSE=1 gitbunch sync ~/repos /media/pc/repos --delete_branch
$ fusermount -u /media/pc

Jika terjadi konflik, maka skrip gitbunch dan memberi kesempatan pada kita untuk menyelesaikan dulu konfliknya dengan git. Setelah itu silakan ulangi menjalankan perintah “gitbunch sync”.

Sebaliknya, setelah bekerja di PC dan ingin mensinkronisasikan pekerjaan ke netbook kembali, tinggal lakukan hal yang sama dari netbook seperti di atas. Bedanya hanya, 1 perintah ini:

$ VERBOSE=1 gitbunch sync /media/pc/repos ~/repos --delete_branch

Backup

Untuk membackup ~/repos ke tempat lain, dapat digunakan perintah:

% gitbunch backup ~/repos /media/flashdisk/repos

Sebetulnya ~/repos dapat juga dikopi/rsync secara langsung, namun skrip ini hanya mengkopi .git/ dari tiap repositori, karena direktori .git sudah berisi semua sejarah perubahan maupun versi terakhir dari tiap file/direktori. Ini mengirit tempat (penting karena flashdisk umumnya saat artikel ini ditulis hanya berukuran 2-8GB).

Jika suatu saat harus melakukan restore dari backup, kita tinggal melakukan kopi/rsync dari backup kembali ke ~/repos, lalu di tiap repositori git mengetikkan:

$ cd ~/repos/repo1
$ git co .
$ cd ~/repos/repo2
$ git co .
# dst.

untuk merestore kembali file-file dari .git/ di tiap repositori.