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


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

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

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

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

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

谢谢。


4862
2018-04-18 07:39


起源

您之前选择了正确的答案。最好让git执行checkout,尊重.gitignore和其他git属性,而不是rsynch复制/同步所有内容。 - VonC


答案:


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


3
2018-04-25 15:32



这是很好的建议,我已将其实施到我的工作流程中。非常感谢。 - Kopty


您需要添加到裸仓库(由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应用程序的目标目录中更新。

9
2018-04-18 07:53



太棒了。非常感谢您的详细解答。 - Kopty
我们可以使用sha密钥作为新的子目录名吗? - dipi evil
@dipievil我不确定sha key如何在这个问题或这个答案中扮演任何角色。 - VonC
例如:git --git-dir = / path / to / project_root.git --work-tree = / path / to / your / DYNAMIC_NAME_COMMIT_SHAKEY checkout -f - dipi evil
@dipievil为什么不呢,的确如此。如果您事先知道SHA1,您可以结帐。 - VonC


这个帖子 在Seb Duggan博客上很好地描述了它。你只需创建 post-receive 钩子包含:

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

添加它 +x 标志,它将检查给定文件夹中的回购。


3
2018-04-18 07:52



这正是我所寻找的。谢谢! - Kopty
你也可以看到我的 gitdeploy 木偶清单。它还处于早期开发阶段,但到目前为止,我测试它的工作原理:) - Hauleth
对不起,你的意思是+ x flag?另外,有没有理由我的post-commit钩子运行但不是我的post-receive?谢谢! - andli
chmod +x .git/hooks/post-receive这意味着您需要为此文件添加可执行权限。 - Hauleth