2

我有以下设置(所有这些都在一台机器上):

  1. Gerrit 已配置并正在运行。
  2. Gerrit 的 Git 存储库位于该机器上。
  3. 所有相关的挂载都带有选项=默认值(意味着允许执行)。
  4. 一个特定的 git 在其中定义了一个“预接收”钩子。
  5. 那个 git 也是一个 Gerrit 项目。
  6. Gerrit 是 2.4.*,Git 是 1.7.4.1

我克隆了上面 4 和 5 中提到的 repo,使用:

  git clone ssh://<host>:29418/<project>.git

我创建了一个简单的更改(我只是“ls”到一个新文件并添加它然后提交):

  cd <project>
  ls > tmp.txt
  git add tmp.txt
  git commit --message="This does not work"
  git push origin HEAD:refs/heads/master

我完全希望推动会被阻止。原因如下:

预接收挂钩在这里:

  ..prompt..> ls -l <basestoragedir>/<project>.git/hooks
  total 4
  -rwxr-xr-x 1 ..user.. ..group.. 279 Jun 24 15:25 pre-receive

预接收钩子本身只是日志文件的一堆回显/转储,但有一个错误退出(应该有效地阻止每次推送):

  #!/bin/bash

  date >> /tmp/pre-receive.log
  echo "Got to the pre-receive hook." >> /tmp/pre-receive.log
  env >> /tmp/pre-receive.log      
  exit -1

所以日志永远不会更新。并且每次尝试对这个 repo 进行更改都会成功。

任何想法为什么?

我在 Gerrit 文档中阅读了一个片段:

Gerrit 不会在它使用的存储库中运行任何标准的 git 钩子,但它确实包含了自己的钩子机制。Gerrit 在 '$site_path'/hooks 中查找具有下列名称的可执行文件。

但我将此解释为 Gerrit 不使用 Git 挂钩来执行其功能。相反,除了 Git 钩子之外,它还提供了自己的行为。真的吗?或者 Gerrit 是否真的破坏了 Git 钩子执行机制?

因此,假设 Gerrit 破坏 Git 钩子,那么我可以实现什么来阻止推送?否定如此重要的策略执行工具的 Gerrit 设计似乎非常愚蠢。

4

2 回答 2

1

最新版本的 gerrit 在其 config-hooks 页面上声明

ref-update

This is called when a push request is received by Gerrit. It allows a push to
be rejected before it is committed to the Gerrit repository. If the script
exits with non-zero return code the push will be rejected.

这在 gerrit 2.4 中不存在,查看其 config-hooks page

我会说 gerrit 确实(并且故意)没有为单个项目运行钩子。通常,如果您想阻止直接向 master 推送,请不要将项目权限授予refs/master/*,并使用标准审查工作流程接受/拒绝签入到项目的存储库。

于 2013-06-26T16:43:57.953 回答
0

但我将此解释为 Gerrit 不使用 Git 挂钩来执行其功能。相反,除了 Git 钩子之外,它还提供了自己的行为。真的吗?

不,Gerrit 不运行 git hooks。没有其他服务器/服务可以运行这些钩子。Gerrit 使用 jgit 来处理所有的 git 操作,并且不调用标准的钩子。

因此,假设 Gerrit 破坏 Git 钩子,那么我可以实现什么来阻止推送?

有几个选择。请参阅http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-hooks.html上的钩子文档- 在 $DAYJOB,我们使用补丁集创建的钩子来检查推送并使用-2 分,如果有问题。这仍然让推送通过,但阻止它被合并到代码库中。

另一种选择是插件,例如提交消息长度验证器插件 - https://gerrit-review.googlesource.com/#/admin/projects/plugins/commit-message-length-validator。如果提交消息长度不符合要求,它将阻止推送。

于 2013-06-26T16:31:00.243 回答