Kalau anda belum berkenalan dengan Git, Git adalah tool version control yang powerful, modern dan cocok buat siapa saja!
. Untuk teknisnya lihat saja detilnya di website git. Kenapa penulis memakai git untuk deploying aplikasi PHP ke shared hosting? Karena penulis sudah cukup lelah memakai transfer file dengan bantuan FTP ataupun SCP!. Kuno dan ribet bro! ada cara yang lebih mudah dan cepat!.
Diagram Alur Kerja (Workflow)
Untuk lebih jelasnya berikut gambaran bagaimana kita bisa deploy atau lebih mudahnya “upload” aplikasi PHP ke shared hosting. Proses deploy atau upload seperti ini hampir sama dengan proses yang terdapat pada platform cloud seperti Heroku, PHPfog dll.
Penjelasan dari gambar diatas sebagai berikut
1. Repositori Lokal
Kalau git belum terinstall, instalah melalui repositori distro anda. Buat repositori lokal dengan git. Ketikan perintah perintah berikut pada shell
$ mkdir php-sample $ cd php-sample $ git init |
Buat file PHP jika memakai command cat seperti dibawah ini jangan lupa untuk menekan CTRL+D untuk mengakhiri editing.
$ cat > index.php <?php echo "Hello Git!"; ?> $ git add index.php $ git commit -m "hello" |
2. Repositori Remote di Shared Hosting
Untuk membuat repositori remote sebagai tempat upload aplikasi dari repositori lokal yang telah kita buat penulis asumsikan bahwa komputer anda sudah mempunyai hak akses ke shared host melalui SSH dan Web Hosting anda support Git. Untuk login melalui SSH ketikkan perintah berikut dan sesuaikan user domain dengan user domain yang anda punya
$ ssh user@domainmu.com |
Untuk mudahnya buat repositori pada direktori webroot, sekali lagi sesuaikan dengan direktori pada web hosting anda biasanya pada direktori ~/www
user@domainmu.com # cd www user@domainmu.com [~/www]# mkdir -p demo/hello user@domainmu.com [~/www]# cd demo && cd hello user@domainmu.com [~/www/demo/hello]# git init |
Buat sample file misalnya .gitignore dan tambahkan file pada repositori git melalui git add kemudian commit file dengan git commit
user@domainmu.com [~/www/demo/hello]# touch .gitignore user@domainmu.com [~/www/demo/hello]# git add .gitignore user@domainmu.com [~/www/demo/hello]# git commit -m "initial commit" |
Ok sepertinya semua sudah siap, saat nya kita upload repositori lokal ke remote dengan git.
3.Operasi Git Push Atau Git Pull
Supaya repositori lokal mengenali repositori remote maka tambahkan url repositori remote melalui command
$ git remote add master user@domainmu.com:www/demo/hello |
Alamat repositori remote pada repositori lokal dapat dicek dengan command git remote
$ git remote -v master user@domainmu.com:www/demo/hello (fetch) master user@domainmu.com:www/demo/hello (push) |
Git Push
Untuk mengupload atau mengupdate repositori remote maka bisa dilakukan dengan mengetikkan perintah berikut pada repositori lokal
$ git push master master |
Jika terjadi error dengan pesan seperti berikut
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to ‘user@domainmu.com:www/demo/hello’
To prevent you from losing history, non-fast-forward updates were
rejected Merge the remote changes before pushing again. See the ‘Note
about fast-forwards’ section of ‘git push –help’ for details.
Maka cara mengatasinya yaitu dengan merge atau mengabungkan file yang ada di repositori remote dengan file-file yang ada pada repositori lokal melalui perintah git pull
Git Pull
Ketikkan perintah berikut pada shell
$ git pull master master From domainmu.com:www/demo/hello * branch master -> FETCH_HEAD Merge made by recursive. 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .gitignore |
kemudian untuk mengetahui apakah repositori lokal dan remote sudah jadi satu dan repositori lokal siap untuk di push, cek dengan command git log. Pada komputer penulis berikut screenshot dari history commit log pada repositori lokal

Git Push Pada Non-Bare Repositori
Kemudian kita coba lagi untuk mengupload file-file repositori lokal dengan git push
$ git push master master |
Jika terjadi error dengan pesan seperti dibawah ini
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require ‘git reset –hard’ to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set ‘receive.denyCurrentBranch’ configuration variable to
remote: error: ‘ignore’ or ‘warn’ in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: ‘receive.denyCurrentBranch’ configuration variable to ‘refuse’.
To user@domainmu.com:www/demo/hello
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to ‘user@domainmu.com:www/demo/hello’
Sejak versi git 1.7.0 keatas nilai configurasi git receive.denyCurrentBranch adalah “refuse” yang artinya repositori lokal tidak akan bisa mengupdate repositori remote dimana repositori remote tersebut aktif checkout pada branch yang sama dengan repositori lokal (branch master pada artikel ini) untuk jenis repositori remote non-bare..Waduh apa pula ini??!…jd tambah pusing! Ok Untuk lebih jelasnya tentang repositori bare atau repositori non-bare silahkan lihat link berikut ini.
Setting receive.denyCurrentBranch
Untuk mengatasi masalah diatas kita perlu mengeset nilai configurasi git receive.denyCurrentBranch ke nilai “false”. caranya login ke server remote
$ ssh user@domainmu.com:www/demo/hello |
Jika sudah berada pada server remote maka edit file config git pada repositori
user@domainmu.com [~/www/demo/hello]# vim .git/config |
dan tambahkan isi file config git dengan konfigurasi berikut
[receive] denyCurrentBranch = false |
Ok tinggal satu langkah lagi dan posting ini akan selesai!
. Jika denyCurrentBranch disetting “false” maka kita dapat mengupdate repositori remote TETAPI file-file pada repositori remote istilahnya “working tree” tidak akan ikut terupdate hanya folder .git yang terupdate….naaahh lho bingung kan?!. Efeknya yaitu misalnya jika kita mengubah file php pada repositori lokal kemudian kita update repositori remote melalui git push, memang push akan sukses tetapi jika kita buka file php tersebut pada browser maka file tersebut akan sama seperti sebelum diupdate!.
Push repositori non-bare dengan branch yang sama dengan efek seperti diatas bukanlah suatu error, tetapi memang git di desain seperti itu. Untuk lebih jelasnya lihat link Why won’t I see changes in the remote repo after “git push”?.
Setting post-update
Untuk mengatasi tidak ter-update nya working tree pada repositori remote setelah git push yaitu melalui custom script atau istilahnya pada git yaitu hooks. Script hooks terletak pada subdirektori hooks di direktori .git.
Login ke server remote dan download script dari http://utsl.gen.nz/git/post-update ke direktori .git/hooks
$ ssh user@domainmu.com:www/demo/hello/.git/hooks user@domainmu.com [..hooks]# wget http://utsl.gen.nz/git/post-update user@domainmu.com [..hooks]# chmod +x post-update |
Semakin Mudah Dengan Git
Jika semua setup sudah berhasil maka untuk mengupdate file-file pada server remote cukup dengan mengubah file-file pada repositori lokal kemudian tambahkan ke git melalui command git add, git commit kemudian git push ke repositori remote. Pada komputer penulis pesan push seperti pada screenshot berikut

dan kemudian hasilnya bisa di cek pada browser misalnya seperti pada contoh repositori diatas
http://www.domainmu.com/demo/hello/index.php |
selamat Mencoba dan Semoga Berhasil!
