Deploy website via Git

2015-02-03

On your server

~/www$ git init
Initialized empty Git repository in /home/example.com/www/.git/

Enable current branch rewrite, cause with are using non-bare repo:

~/www$ git config receive.denyCurrentBranch ignore

Create hook .git/hooks/post-receive and write into it:

#!/bin/sh
cd ..
GIT_DIR='.git'
git reset --hard

Make your hook executive: ~/www$ chmod +x .git/hooks/post-receive

On developer machine

Create repo, add all needed files to it, make your first commit.

git init
git config --local user.name "Developer Name"
git config --local user.email "developer@company.com"
git add <some_files>
git commit -m 'initial commit'

Now add remote repository as origin:

git remote add origin user@example.com:~/www/
git push --set-upstream origin master

How to work with repository?

After you have changed some files you should add them to commit and send this commit to repository.

git commit -am 'some commit message describes accepted changes'
git push

Security

Make sure that your .htaccess file blocks access to .git/ and .gitignore. To prevent access put the following lines to your .htaccess:

# Prevents access to dot files (.git, .htaccess) - security.
RewriteCond %{SCRIPT_FILENAME} -d
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]

What if I change files directly on server?

All uncommited file changes on server will be ignored after git push from developer machine. If you still want to change files directly on server you should use another two hooks:

.git/hooks/pre-receive

#!/bin/sh
cd ..
GIT_DIR='.git'
git stash save --quiet
git stash show || true

.git/hooks/post-receive

#!/bin/sh
cd ..
GIT_DIR='.git'
git reset --hard
git stash pop --quiet || git reset --hard