想要设置一个将已提交文件复制到特定文件夹的挂钩

时间:2013-04-18 07:39:07

标签: git githooks gitlab

背景:使用PHP Laravel框架开发Facebook应用程序& MySQL for database。

我已经在我们的开发服务器上设置了Gitlab,并在其上创建了一个存储库,其中已经添加了团队并且正在提交&推送代码。

我想要做的是,当我将代码推送到GitLab上的特定分支(例如Master)时,我希望它可以在/ var / www / productname中使用,以便我可以在Facebook画布中测试它同样(某些事情发生在那里,无法在本地机器上测试)。

但是,我不希望钩子在每次主控上发生推送时复制所有文件,只需要修改文件。

任何人都可以帮忙解决这个问题吗?

谢谢。

3 个答案:

答案 0 :(得分:11)

您需要添加一个post-receive挂钩的裸仓库(由GitLab管理):

  • 维护一个工作树(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 post-receive checkout without root folder”,即:
请务必指定--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应用的目标目录中更新。

答案 1 :(得分:4)

使用rsync而不是cp进行此操作。它会自动进行差异检查。这样你的post-commit钩子就不会变得不必要了。

答案 2 :(得分:3)

Seb Duggan博客上的

This post很好地描述了它。您只需创建包含以下内容的post-receive挂钩:

#!/bin/sh
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f

添加+x标志,它会在指定文件夹中检出您的仓库。