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