12

背景:使用 PHP Laravel 框架和 MySQL 数据库开发 Facebook 应用程序。

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

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

但是,我不希望每次在 master 上发生推送时钩子都复制所有文件,而只是复制被修改的文件。

任何人都可以帮助解决这样的钩子吗?

谢谢你。

4

3 回答 3

12

您需要向裸仓库(由 GitLab 管理)添加一个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 post-receive checkout without root folder ”,即:
确保您指定--git-dirand --git-work-tree

git --git-dir=/path/to/project_root.git --work-tree=/path/to/your/workingtree checkout -f

同样,/path/to/your/workingtree可以是:

  • 只有一个中间工作树供您从中提取要复制的相关文件。
  • 或您的应用程序的路径,如果您希望在您的 wab 应用程序的目标目录中更新 master 中的所有文件。
于 2013-04-18T07:53:25.000 回答
4

Seb Duggan 博客上的这篇文章很好地描述了它。您只需创建post-receive包含以下内容的钩子:

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

添加它+x标志,它将在给定文件夹中签出您的回购。

于 2013-04-18T07:52:49.510 回答
4

使用 rsync 而不是 cp 进行此操作。它会自动进行差异检查。这样你的提交后钩子就不会变得不必要的复杂。

于 2013-04-25T15:32:14.900 回答