Want to setup a hook that copies committed files t

2019-02-12 11:20发布

问题:

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.

回答1:

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



回答2:

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.


回答3:

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.