背景: 使用PHP Laravel框架和MySQL为数据库开发Facebook应用程序。
我在我们的开发服务器上设置了Gitlab,并在其上创建了一个存储库,其中添加了团队并提交和推送代码。
我想要做的是,当我将代码推送到GitLab上的特定分支(例如Master)时,我希望它可以在/ var / www / productname中使用,这样我也可以在Facebook画布中测试它(某些事情发生在那里,无法在您的本地机器上测试)。
但是,我不希望钩子在每次在master上发生推送时复制所有文件,只是修改了文件。
任何人都可以帮助这样的钩子吗?
谢谢。
使用rsync而不是cp进行此操作。它会自动进行差异检查。这样你的post-commit钩子就不会变得不必要了。
您需要添加到裸仓库(由GitLab管理)a post-receive
钩子会:
- 维护一个工作树(git checkout -f master)
- 从那个工作中复制你想要的文件
那将是:
cd ~git/repositories/yourRepo.git/hooks
touch post-receive
chmod +x post-receive
您可以确保只有在某人推动分支时才会激活挂钩 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
对于该挂钩完成的结账,请参阅“GIT收到后没有根文件夹的结帐“, 那是:
确保你指定 --git-dir
和 --git-work-tree
:
git --git-dir=/path/to/project_root.git --work-tree=/path/to/your/workingtree checkout -f
再次, /path/to/your/workingtree
可:
- 只有一个中间工作树,您可以从中提取要复制的相关文件。
- 或者你的应用程序的路径,如果你想 所有 来自master的文件将在wab应用程序的目标目录中更新。
这个帖子 在Seb Duggan博客上很好地描述了它。你只需创建 post-receive
钩子包含:
#!/bin/sh
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f
添加它 +x
标志,它将检查给定文件夹中的回购。