Gerrit阻止我的Git预接收钩子吗?

时间:2013-06-26 16:12:29

标签: git gerrit

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

  1. Gerrit已配置并正在运行。
  2. Gerrit的Git存储库位于该计算机上。
  3. 所有相关的坐骑都带有options = defaults(意味着允许exec)。
  4. 特定的git中定义了一个“预接收”钩子。
  5. 那个git也是一个Gerrit项目。
  6. Gerrit是2.4。*,Git是1.7.4.1
  7. 我使用以下方法克隆上面4和5中提到的回购:

      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
    

    因此日志永远不会更新。并且每次尝试推动对此回购的改变都会成功。

    任何想法为什么?

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

      

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

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

    因此假设Gerrit clobbers Git钩子然后我可以实现哪些阻止推送? Gerrit设计似乎非常愚蠢地否定了这样一个重要的政策执行工具。

2 个答案:

答案 0 :(得分:1)

最新版本的gerrit在its config-hooks page上声明了

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中不存在its config-hooks page

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

答案 1 :(得分:0)

  

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

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

  

因此假设Gerrit clobbers 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。如果提交消息长度与要求不匹配,它将阻止推送。