【问题标题】:Is Gerrit blocking my Git pre-receive hook?Gerrit 是否阻止了我的 Git 预接收挂钩?
【发布时间】:2013-06-26 16:12:29
【问题描述】:

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

  1. Gerrit 已配置并正在运行。
  2. Gerrit 的 Git 存储库位于该计算机上。
  3. 所有相关挂载都带有 options=defaults(表示允许执行)。
  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 文档中阅读了一个 sn-p:

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

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

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

【问题讨论】:

    标签: git gerrit


    【解决方案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 确实(并且故意)不为单个项目运行挂钩。通常,如果您想阻止直接向 master 推送,请不要将项目权限授予 refs/master/*,并使用标准审核工作流程来接受/拒绝签入项目的存储库。

    【讨论】:

    • 谢谢马克。我了解 Gerrit 工作流程。权限不能解决我的问题。 Gerrit 的设计方式,不能阻止不符合>policy
    • 我认为您可能了解工作流程,但必须确定:) 2.4 中似乎没有太多可用的功能,但正如 Brad 还指出的那样,插件可能是一个更好的选择如果你有机会升级。 耸耸肩
    • (我的编辑太晚了)......在政策等方面,我们不允许人工添加验证标志,这是由 jenkins build 完成的,它暴露了错误检查-ins,然后开发人员推送补丁,但这确实是您在“留给脚本必须进入并清理”中所说的。它对我们有用(我们在 2.5.1)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢布拉德。我想我只是 SOL,除非我从 2.4.x -> 2.6 升级。 (2.4 也不支持插件。)我不知道您可以编写阻止推送的插件。很高兴知道这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多