如何设置服务器端预接收挂钩?

时间:2018-05-24 09:15:58

标签: git githooks

我是git hooks和服务器端git功能的新手。我在客户端git上工作以提交并推送我的代码,我们使用应用程序生命周期管理(ALM)工具进行git merge。 我正在尝试编写git hooks来对存储库中的新/已修改文件进行一些测试。我能够编写和测试客户端钩子,如 pre-commit

现在,我需要添加一些服务器端git挂钩以在合并到master之前验证文件,因为有一个更改是使用 -no-verify 选项跳过客户端验证。当我浏览一些git hook教程时, pre-push hook是服务器端钩子。我试图创建预推钩,它正在客户端工作。现在,如果用户尝试推送更改,即使使用 --no-verify 选项(不应在客户端上进行控制),如何将其作为服务器端挂钩并强制验证文件。

我的一个大问题是当我们从本地分支机构/回购站点git push时触发服务器挂钩。

创建钩子:

创建了一个名为pre-commit的钩子,并将其放在某个文件夹 git_hooks/pre-push 下以及 .git/hooks/pre-push 中。现在,为我的预推脚本创建了一个符号链接。因此,每当我执行 git push 时,它都会触发.git / hooks / pre-push,这是我的脚本的符号链接 git_hooks/pre-push

修改

我认为pre-pushpre-receive挂钩是相同的,因为两者都在git push命令上触发但pre-push仅在客户端工作,pre-recieve正在进行服务器端。 我创建了pre-receive钩子并将其推送到主分支。现在,当我git push得到错误时:无法生成挂钩/预接收:没有这样的文件或目录

我在 Windows Linux 平台上尝试此操作。在Windows上我收到此错误,在Linux上它甚至没有被触发。我在两个平台上的主分支上放置了pre-receive挂钩。

1 个答案:

答案 0 :(得分:2)

您应该查看Server side hooks文档部分。

  

有三个钩子可以让你对git推送过程的不同阶段做出反应。

  • 预接收
  • 更新
  • 后接收

当您推送到服务器pre-receive时,会触发挂钩。然后,对于每个分支,您已经触发了update挂钩。当这些挂钩完成且没有错误时,将应用补丁并触发post-receive挂钩

更详细DOC关于pre-receive hook:

  

当git-receive-pack响应git push并更新其存储库中的引用时,将调用此钩子。在开始更新远程存储库上的refs之前,将调用预接收挂钩。其退出状态决定了更新的成功或失败。

UPD

要设置pre-receive服务器端挂钩,应将脚本放入服务器上的.git/hooks目录。并将其命名为pre-receive。就是这样 您不应该在repo中创建hooks目录并提交它。 pre-receive脚本位于repo之外

<强> UPD
这是示例脚本:

#!/bin/bash


# check each branch being pushed

echo "pre-receive HOOK"

while read old_sha new_sha refname
do

if git diff "$old_sha" "$new_sha" | grep -qE '^\+(<<<<<<<|>>>>>>>)'; then
    echo "Saw a conflict marker in $(basename "$refname")."
    git diff "$old_sha" "$new_sha" | grep -nE '^\+(<<<<<<<|>>>>>>>)'
    exit 1
fi

if git diff "$old_sha" "$new_sha" | grep -qE '^\+.*\s+$'; then
    echo "Saw whitespaces at EOL."
    git diff "$old_sha" "$new_sha" | grep -nE '^\+.*\s+$'
    exit 1
fi

done

exit 0