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

How to setup server side pre-receive hook?

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

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

我的大问题是当我们从本地 branch/repo.

执行 git push 时如何触发服务器挂钩

创建钩子:

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

编辑:

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

我正在 WindowsLinux 平台上进行尝试。在 Windows 我收到这个错误,在 Linux 它甚至没有被触发。我在两个平台上的 master 分支上放置了 pre-receive 钩子。

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

There are three hooks that let you react to different stages of the git push process.

  • 预接收
  • 更新
  • post-接收

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

关于 pre-receive 挂钩的 DOC 更详细:

This hook is invoked by git-receive-pack when it reacts to git push and updates reference(s) in its repository. Just before starting to update refs on the remote repository, the pre-receive hook is invoked. Its exit status determines the success or failure of the update.

UPD

要设置 pre-receive 服务器端挂钩,您 应该将脚本放入服务器 .git/hooks 目录中 。并将其命名为 pre-receive。仅此而已。
你不应该在你的仓库中创建 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