Q:

Want to setup a hook that copies committed files to a particular folder

Background: Developing a Facebook app using PHP Laravel framework & MySQL for database.
I have setup Gitlab on our development server and created a repository on it where the team has been added and is committing & pushing code.
What I would like to do is, when I push code to a particular branch on GitLab (for example Master) I would like it to be available at /var/www/productname so that I can test it within the Facebook canvas as well (certain things happen there that can't be tested on your local machine).
However, I don't want the hook to copy all the files over every time a push happens on master, just the files that were modified.
Can anyone help out with such a hook?
Thank you.

A:

You would need to add to the bare repo (managed by GitLab) a post-receive hook which would:

maintain a working tree (git checkout -f master)
copy the files you want from that working

That would be:
cd ~git/repositories/yourRepo.git/hooks
touch post-receive
chmod +x post-receive

You can make sure that hook will only be active if someone pushes on branch master:
#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" == "$branch" ]; then
        # Do something
    fi
done

For the checkout done by that hook, see "GIT post-receive checkout without root folder", that is:
make sure you specify --git-dir and --git-work-tree:
git --git-dir=/path/to/project_root.git --work-tree=/path/to/your/workingtree checkout -f

Again, /path/to/your/workingtree can be:

only an intermediate working tree for you to extract from it the relevant files you want to copy.
or the path to your app, if you want all the files from master to be updated in the destination directory of your wab app.

A:

This post on Seb Duggan blog describe it nicely. You simply create post-receive hook that contain:
#!/bin/sh
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f

Add it +x flag and it will checkout your repo in given folder.

A:

Use rsync rather than cp for this operation. It does diff checking automatically. that way your post-commit hook doesn't become needlessly complicated.

