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

Tec*_*hie 6 git githooks

我是git hook和服务器端git功能的新手。我在客户端git上进行提交和推送代码,我们使用Application Lifecycle Management(ALM)工具进行git merge 。我正在尝试编写git挂钩,以对存储库中的新文件/修改过的文件进行一些测试。我能够编写和测试客户端挂钩pre-commit

现在,我需要添加一些服务器端git钩子以在合并到master之前验证文件,因为有一个更改可以跳过跳过使用-no-verify选项进行客户端验证。当我阅读一些git hook教程时,pre-pushhook是服务器端的钩子。我试图创建预推钩子,它正在客户端上工作。现在,当用户尝试使用--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钩子并将其推到master分支。现在,当我确实git push收到此 错误时:无法生成钩子/预先接收:没有这样的文件或目录

我正在WindowsLinux平台上尝试此操作。在Windows上,我收到此错误;在Linux上,甚至没有触发过。我pre-receive在两个平台上的master分支上都放置了钩子。

Eug*_*kov 5

您应该查看“ 服务器端挂钩”文档部分。

通过三个钩子,您可以对git push过程的不同阶段做出反应。

  • 预先接收
  • 更新
  • 接收后

当您推送到服务器时,pre-receive挂钩被触发。然后,对于您按下的每个分支,update都会触发钩子。当这些挂钩完成而没有错误时,将应用补丁并post-receive触发挂钩

有关钩子的更详细的DOCpre-receive

当git-receive-pack对git push做出反应并更新其存储库中的引用时,该钩子就会被git-receive-pack调用。在开始更新远程存储库上的引用之前,将调用pre-receive挂钩。其退出状态确定更新的成功或失败。

UPD

要设置pre-receive服务器端挂钩,应将脚本放入.git/hooks服务器目录中。并命名pre-receive。就这些。
您不应hooks在存储库中创建目录并提交。该pre-receive脚本不在仓库中

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
Run Code Online (Sandbox Code Playgroud)