我是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-push
和pre-receive
挂钩是相同的,因为两者都在git push
命令上触发但pre-push
仅在客户端工作,pre-recieve
正在进行服务器端。
我创建了pre-receive
钩子并将其推送到主分支。现在,当我git push
得到错误时:无法生成挂钩/预接收:没有这样的文件或目录。
我在 Windows 和 Linux 平台上尝试此操作。在Windows上我收到此错误,在Linux上它甚至没有被触发。我在两个平台上的主分支上放置了pre-receive
挂钩。
答案 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