Git 要设置一个钩子将提交的文件复制到特定文件夹吗

Git 要设置一个钩子将提交的文件复制到特定文件夹吗,git,githooks,gitlab,Git,Githooks,Gitlab,背景:使用PHP Laravel框架和MySQL数据库开发Facebook应用程序 我已经在我们的开发服务器上安装了Gitlab,并在上面创建了一个存储库,其中添加了团队,并正在提交和推送代码 我想做的是,当我将代码推送到GitLab上的某个特定分支(例如Master)时,我希望它可以在/var/www/productname上获得,这样我也可以在Facebook画布上测试它(在那里发生的某些事情无法在本地机器上测试) 但是,我不希望每次在主控上推送时钩子都复制所有文件,只复制修改过的文件 有人

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

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

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

但是,我不希望每次在主控上推送时钩子都复制所有文件,只复制修改过的文件

有人能帮上忙吗

谢谢。

在Seb Duggan的博客上描述得很好。您只需创建包含以下内容的
post receive
hook:

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

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

您需要在裸回购协议(由GitLab管理)中添加一个
post receive
挂钩,该挂钩将:

  • 维护一个工作树(git checkout-f master)
  • 从该工作区复制所需的文件
这将是:

cd ~git/repositories/yourRepo.git/hooks
touch post-receive
chmod +x post-receive
您可以确保只有当有人按下分支
主节点
时,钩子才会激活:

#!/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 dir
--git工作树

git --git-dir=/path/to/project_root.git --work-tree=/path/to/your/workingtree checkout -f
同样,
/path/to/your/workingtree
可以是:

  • 只有一个中间工作树供您从中提取要复制的相关文件
  • 或应用程序的路径,如果您希望更新wab应用程序目标目录中来自master的所有文件

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

这正是我想要的。非常感谢。你也可以看到我的木偶清单。它仍处于早期开发阶段,但正如我迄今为止测试的那样,它是有效的:)对不起,但你所说的+x标志是什么意思?还有,我的post-commit钩子运行而不是post-receive有什么原因吗?谢谢
chmod+x.git/hooks/post-receive
这意味着您需要向该文件添加可执行权限。这非常完美。非常感谢您的详细回答。我们可以使用sha键作为新的子目录名吗?@dipievil我不确定sha键在这个问题或答案中起什么作用。例如:git--git dir=/path/to/project\u root.git--work tree=/path/to/your/DYNAMIC\u COMMIT\u SHAKEY checkout-f@dipievil为什么不呢。如果你事先知道你要结帐的步骤,这是一个很好的建议,我已经把它应用到我的工作流程中了。非常感谢。您以前选择了正确的答案。最好让git进行签出,尊重.gitignore和其他git属性,而不是复制/同步所有内容的rsynch。