Gerrit是否阻止了我的Git预接收钩子?

Gerrit是否阻止了我的Git预接收钩子?,git,gerrit,Git,Gerrit,我有以下设置(所有这些都在一台机器上): Gerrit已配置并正在运行 Gerrit的Git存储库位于该机器上 所有相关挂载都带有options=默认值(表示允许执行) 特定git中定义了一个“预接收”钩子 git也是一个Gerrit项目 Gerrit是2.4.*而Git是1.7.4.1 我使用以下方法克隆上述第4和第5条中提到的回购: git clone ssh://<host>:29418/<project>.git 所以日志永远不会更新。每一次推动回购协议改变

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

  • Gerrit已配置并正在运行
  • Gerrit的Git存储库位于该机器上
  • 所有相关挂载都带有options=默认值(表示允许执行)
  • 特定git中定义了一个“预接收”钩子
  • git也是一个Gerrit项目
  • Gerrit是2.4.*而Git是1.7.4.1
  • 我使用以下方法克隆上述第4和第5条中提到的回购:

      git clone ssh://<host>:29418/<project>.git
    
    所以日志永远不会更新。每一次推动回购协议改变的尝试都成功了

    你知道为什么吗

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

    Gerrit不运行存储库中的任何标准git挂钩 它可以使用,但它确实包含自己的挂钩机制。 Gerrit在“$site\u path”/hooks中查找列出名称的可执行文件 下面

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

    因此,假设Gerrit clobbers使用Git钩子,那么我可以实现什么来阻止推送呢?Gerrit的设计否定了如此重要的策略执行工具,这似乎相当愚蠢

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

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

    因此,假设Gerrit clobbers使用Git钩子,那么我可以实现什么来阻止推送呢

    有两种选择。请参阅$DAYJOB的hooks文档,我们使用一个补丁集创建的hook来检查推送,如果出现问题,我们将以-2的分数进行检查。这仍然允许推送,但阻止它合并到代码库中


    另一个选项是插件,如提交消息长度验证插件-。如果提交消息长度不符合要求,它将阻止推送。

    gerrit的最新版本对此进行了说明

    这在gerrit 2.4中并不存在


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

    谢谢。我了解Gerrit的工作流程。权限不能解决我的问题。按照Gerrit的设计方式,不能阻止不符合>策略<的推送。诸如命名约定、注释要求,甚至简单(而且非常常见)的要求,比如:阻止未通过lint(或类似)检查或代码复杂性检查的推送。相反,Gerrit只允许推送通过,而人或脚本必须进入并清理不符合要求的推送。我很高兴看到他们将在2.6.1中解决这个问题。但目前这对我没有帮助。我猜我只是索尔?我想你可能了解工作流程,但必须确定:)2.4中似乎没有太多可用内容,但正如Brad也指出的,如果你有机会升级,插件可能是更好的选择。耸耸肩(让我的编辑太晚了)。。。在策略等方面,我们不允许人类添加验证标志,这是由jenkins build完成的,它公开了错误的签入,然后开发人员推送补丁,但这确实是您在“留给脚本进行清理”中所说的。它对我们有用(我们在2.5.1上)。谢谢Brad。我想我只是索尔,除非我从2.4.x->2.6升级。(插件在2.4中也不受支持。)我不知道您可以编写阻止推送的插件。很高兴知道。
      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
    
    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.