如何在 GitLab 中激活预接收挂钩?

Ste*_*fan 7 git githooks gitlab

我需要检查进入 GitLab 的每个提交并阻止其中包含特定文件的任何提交。我使用了此处的文档

pre-receive我已经在目录中创建了一个名为的文件.git/custom_hooks

该文件仅包含内容:

#!/bin/sh
exit 1
Run Code Online (Sandbox Code Playgroud)

我相信,这应该拒绝任何将代码推送到存储库的尝试(?)

该文件由 git 所有并且可执行:

ls -a给出响应:

-rwxrwxrwx 1 git root 550 ...

custom_hooks 目录也是可执行的并由 git 用户拥有。

但是所有提交都没有问题地完成,提交挂钩似乎没有以任何方式激活。

我在文档中没有看到我应该做的任何其他事情。我错过了什么吗?

LeG*_*GEC 2

一种方法是在本地计算机上设置预提交挂钩,并检查暂存文件中是否存在所述文件:

# .git/hooks/pre-comit :

#!/bin/bash

forbidden=$(git diff --cached --diff-filter=ACMR -- forbidden/file)

if [ -n "$forbidden" ]; then
    echo "*** rejecting commit, file '$forbidden' is present" >&2
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

一个主要好处是:您(或其他用户)现在就被告知不应提交该文件,而不是稍后在推送被拒绝时通知。

缺点是:

  • 这个钩子必须在你的仓库的每个克隆上安装一次
  • 用户可以跳过该钩子(手动卸载它,修改钩子脚本,或运行git commit -n以跳过pre-commitcommit-msg钩子)

如果你需要100%肯定这个文件不会到达中央仓库,防止这种情况的一种方法确实是设置一个pre-receive钩子,但这个钩子必须设置在服务器上。

您标记了您的问题gitlab,这里是设置此类挂钩的文档页面:

https://docs.gitlab.com/ee/administration/server_hooks.html

您需要访问 gitlab 的安装文件系统(例如:使用管理员帐户 ssh 到 gitlab 的服务器),并pre-receive在适当的项目中设置挂钩。

请注意,由于用户可以一次性推送整个分支(甚至多个分支),因此您应该检查推送到服务器的所有新提交中是否存在所述文件,而不仅仅是每个分支的尖端。