我有以下设置(所有这些都在一台机器上):
我使用以下方法克隆上面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设计似乎非常愚蠢地否定了这样一个重要的政策执行工具。
答案 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。如果提交消息长度与要求不匹配,它将阻止推送。