如何忽略每个命令的 Gitblit 钩子?

How to ignore Gitblit hook per command?

我们在 Gitblit 中有一个预接收挂钩,可以防止将不需要的提交推送到服务器。挂钩逻辑有时会产生误报。真的很难做到绝对准确。我们希望能够以某种方式执行忽略挂钩的 push 命令的修改版本。

我试过简单地发出 git push --force,但它不起作用。钩子不被忽略

有什么方法可以将自定义参数添加到 git push 并在 Gitblit Groovy 脚本中解析它们?

类似

git push origin --ignoreOurCustomHook

然后在脚本中

if(someObject.getParameter('ignoreOurCustomHook') != null)
{
  break
}

到目前为止,通过 JGit 文档挖掘没有任何用处。也许我可以使用 receivePacket.pckIn 手动解析整个命令,但它似乎超级硬核,并且在我第一次尝试读取数据包时就崩溃了。

如有任何建议,我们将不胜感激。

您可以使用 --signed flag for git push 来绕过实际的挂钩逻辑。

正常推送将在没有 --signed 标志的情况下完成,但是当挂钩提供误报时,您执行 git push --signed 并在挂钩中评估环境变量 GIT_PUSH_CERT_SIGNER or GIT_PUSH_CERT_KEY。这样做,您还可以清楚地确定谁通过覆盖挂钩进行了推送...

您必须使用调试器进行一些试验,但可以按照您的意愿发送推送参数。让他们使用 Groovy 钩子机制可能很棘手。或者可能不是。没看过

git push --receive-pack='git receive-pack --ignoreOurCustomHook' origin master

一旦你有一些工作,你应该能够设置一个自定义遥控器来更干净地处理它:

$ cat .git/config
...
[remote "ignoreHook"]
  url = https://somewhere.com/r/myrepo.git
  receivepack = git receive-pack --ignoreCustomHook

$ git push ignoreHook master