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

Kop*_*pty 12 git githooks gitlab

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

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

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

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

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

谢谢.

Von*_*onC 11

你需要添加一个post-receive钩子,它可以:添加到裸仓库(由GitLab管理):

  • 维护一个工作树(git checkout -f master)
  • 从那个工作中复制你想要的文件

那将是:

cd ~git/repositories/yourRepo.git/hooks
touch post-receive
chmod +x post-receive
Run Code Online (Sandbox Code Playgroud)

您可以确保只有在某人推动分支时才会激活挂钩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
Run Code Online (Sandbox Code Playgroud)

对于该挂钩完成的结账,请参阅" 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
Run Code Online (Sandbox Code Playgroud)

再次,/path/to/your/workingtree可以是:

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


小智 5

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