Deploying on shared servers with git

November 23, 2011

This post was originally published in the Rambling Labs Blog on November 23, 2011.

There’s a project I’m currently working on, which is right now hosted on shared servers. I worked for a little while before on this project, but just to add some tiny features and fix some bugs, so I didn’t have the need back then to have a deployment process all set up.

But now, I’m probably going to be working for a couple of months on this, so I figured it would be better for my own sanity to just set everything up from the very beginning, to make the deployment process as easy as possible.

I googled for a while and the people seem to be using git for this. Now, there are a couple of options out there. There’s resmo’s git-ftp which is a git powered ftp client written as shell script, aizatto’s git-deploy which is also written as a shell script, and mislav’s git-deploy gem, which is written in ruby.

I was gonna try every one of them, but I decided to check the projects’ last commit date and pick the one that was most recently updated, which turned out to be the git-deploy gem. Also, it got my attention that the gem says Heroku-style deployment in the project’s readme on GitHub.

It is easy to set up, as long as you have ssh and git in place both locally and on the server. I assure you that it will pay off almost immediately. Let’s set up ssh and git on the shared server first.

The first thing you need to do, is set up ssh for no more password prompts.

Then, you have to install git on your shared server, on which you probably have limited permissions. So, how do you do that? Well, you’ll have to download git from GitHub:

wget -O ~/

Extract it to the home directory:

cd ~
unzip v1.7.7.4
mv git-git-* git

And then compile it with:

cd ~/git
make prefix=/usr all

After that, add this to the ~/.bashrc of your server:

if [ -d "$HOME/git/bin-wrappers" ]; then

When you’re finished with that, just proceed with the gem installation and setup. That is, installing the gem, adding the corresponding remote to your git repository (where your code will reside) and initializing git-deploy:

gem install git-deploy
git add remote production username@production.domain:/path/to/app
git deploy setup -r production
git deploy init

And that’s it! Now you can deploy with:

git push production master