Deploy Atau Upload Aplikasi PHP Di Shared Hosting Melalui Git

Git LogoKalau anda belum berkenalan dengan Git, Git adalah tool version control yang powerful, modern dan cocok buat siapa saja! :D . 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.git-sharedhost-workflow

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 merge

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
push post-update-hello
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! :)

EMAIL NEWSLETTER

You don't have to check this blog regularly...just sign-up and any post will be send directly to your email ;)

  • pusing85

    buset dah… manual habes…..!!! mangtabs juragan…
    kalo disambung editor macam netbeans bisa g ya gan..? dulu saya pernah di ajarin temen pake netbeans+subversion+googlecode, nah kalo git , kira2 bisa lebih mudah seperti itu g ya …?? terima kasih….

    • equan_pr

      Bisalah!…cuman kalo Netbeans harus install plugin Git dulu. Kalau repositori online buat Git coba aja Github.

      • pusing85

        cara ngonekinnya sama kaya pake subversion gitu g gan…???

        • equan_pr

          Ya gak lah. Soalnya Git dan Subversion meskipun tujuannya sama sebagai version control system tetapi secara arsitektur mereka berbeda. Kalau Subversion sifat repositorinya tersentralisasi jadi master repositorinya cuman satu…ya di server subversion tetapi kalau Git repositorinya bersifat terdistribusi sehingga tiap copy dari repositorinya merupakan master itu sendiri. Kalau pengen latihan pakai Git,,saya sarankan pakai command shell aja dahulu, bro pakai Linux kan? :)