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 所以日志永远不会更新。每一次推动回购协议改变
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.