我是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-push和pre-receive钩子都与在git push命令上触发的钩子相同,但pre-push仅在客户端起作用,pre-recieve在服务器端起作用。我创建了pre-receive钩子并将其推到master分支。现在,当我确实git push收到此 错误时:无法生成钩子/预先接收:没有这样的文件或目录。
我正在Windows和Linux平台上尝试此操作。在Windows上,我收到此错误;在Linux上,甚至没有触发过。我pre-receive在两个平台上的master分支上都放置了钩子。
您应该查看“ 服务器端挂钩”文档部分。
通过三个钩子,您可以对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)