自从SVN切换到Git后,我们失去了通过subversion服务器上的 pre-commit
钩子强制执行编码标准的能力 .
使用Git,您只能以任何方式在客户端上预先提交挂钩cannot be enforced . 更糟糕的是,我们让开发人员使用所有三个主要操作系统,因此在Linux或OS X上运行的预提交挂钩不会自动在Windows上运行 .
要做的就是在服务器上实现 pre-receive
钩子,但解决方案并不像看起来那么容易:
想象一下,开发人员做了20次提交并希望推动它们 . 我知道的所有预提交和预接收挂钩(1,2)只检查单个提交,这将最终失败并阻止推送 . 现在,开发人员修复了问题并进行了另一次提交,并尝试再次推送 . 由于钩子检查单个提交,它将再次失败 .
所以我们需要一个 pre-receive
钩子,它会在所有要推送的提交中生成所有已更改文件的列表,并仅在当前状态下运行phpcs .
这样的钩子脚本是否已存在?哪里?
编辑:似乎有一个script that creates that list of files - 不幸的是在Python中,但可以移植 . 我仍然对PHPCS的预制解决方案感兴趣:)
13 回答
我宁愿不等待服务器端钩子来控制推送 .
您可以设置一个中间存储库,它可以非常定期地获取每个开发人员的分支,并审核每个新提交,如果提交无法满足某些预定义标准,则发送电子邮件 .
您也可以在中央仓库上预先接收挂钩,但至少开发人员会更快意识到潜在问题 .
我不是这里的技术解决方案,但是如果你真的想打扰别人,那么将
phpcs
集成到您的CI设置中并开始在您的问题管理器中打开它的门票 . ;-)我不认为这是最好的主意,因为它确实不是技术问题 . 你的问题不是提前或提交后的钩子,但人们不这样做,你认为你必须强迫它们 .
总而言之,我理解编码标准的重要性,我也强制执行,但是它有一个社会组件(或方面) .
听起来和你一起工作的人要么不知道更好(还是)还是不愿意学习 . 所以,如果他们不知道更好,你必须与他们合作并教他们遵守你的要求 . 这包括教他们为什么约定很重要,最后他们需要了解在一切都是绿色之前不会完成一项功能 .
也许这需要项目管理(我收集的是你)将问题分解为多个任务,直到他们得到它:
功能本身
phpcs
文档
单位测试
(没有具体的顺序 . ;-))
如果他们不愿意学习,你总是可以采取更激烈的措施 . 就像,我会慢慢开始,每周进行一次性能评估(1对1的情况)并重申为什么他们不这样做 . 如果这没有帮助 - 我想你会 grab 我的漂移 .
在Drupal项目中,我们最近迁移到Git并且正在研究类似的问题 . 在我们的例子中,我们不希望任何人在LICENSE.txt文件中检查模块,因为我们的打包脚本会自动执行此操作 . 经过一些来回,我们想出的是一个不拒绝错误提交的接收挂钩,但每次检测到错误提交(对于某些“坏”定义)它会自动在我们的错误中提出一个关键错误跟踪器 . 这样代码仍然可以提交,但是模块维护者和相应的网站管理员团队都会立即收到通知,告知有问题,应该修复 . 您可以轻松发送电子邮件或发送推文或您想要的任何其他通知 .
实际上我们还没有实现,但这是我们Git实施团队有时间的时候我们正在制定的计划 . :-)
基本上,除了改述之外,你所描述的问题没有好的解决办法;它不是“阻止可检测到的违规”,而是“报告可检测到的违规行为” . 我认为这是你能做的最好的事情 .
使用jenkins gerrit:
http://alblue.bandlem.com/2011/02/gerrit-git-review-with-jenkins-ci.html
如果您的构建失败,推送将被拒绝 .
http://source.android.com/source/life-of-a-patch.html
泰瑞尔
我并没有说好'git-anese',但在Mercurial中有一个名为'changegroup'的钩子选项,它基本上检查一组传入提交的'top'提交 . 也许社区中的某个人可以告诉你如果有一个等价物 . git的'changegroup'是什么?
https://www.mercurial-scm.org/wiki/Hook#The_changegroup_hook
也许这个问题的答案有帮助吗? Git pre-receive hook
我用过这个钩子:http://criticallog.thornet.net/2011/06/02/running-php-linter-before-pushing-changes-to-a-git-repository/
并修改它也用phpcs测试代码 .
可能包含一些错误,我有硬编码的drupal代码标准,但它的工作原理! http://pastebin.com/fEmN519B
我没有直接使用预先提交/预先接收挂钩等对此问题的确切答案 .
我从另一个方面处理这个问题,运行一个CI服务器,(我使用jenkins)运行phpcs和Jenkins的checkstyle插件 .
这允许我根据checkstyle报告使构建失败并通过电子邮件发送提交者 .
我可以选择设置阈值,因此如果最多有5个新样式违规,我会得到一个不稳定的构建,但如果提交的样式超过5则会失败 .
此外,我可以设置总体阈值,因此整个项目中超过10次违规导致失败并向团队发送电子邮件 .
如上所述,这可能是您的中间服务器 . post构建操作可以包括Push to another git repo .
我们使用git包装器(为了我们的目的替换git-submodules更加理智)并且它具有从魔术目录自动设置预提交挂钩的副作用 . 由于这是在商业环境中,没有抱怨(并且有办法将其关闭) .
我也试过这个 . 我目前没有手头的代码,但我使用其中一个钩子(不是预先接收,我认为是更新一个)来临时检查新的ref . 你可以通过一个签出的树来加快速度,你需要更新它,只需要做一些浅的克隆 .
这允许访问整个源树,您不仅可以在通过推送更改的文件上运行CS,还可以运行单元或冒烟测试 .
我也同意其他一些评论,这些测试应该保持在最低限度,因为没有什么比被挂钩阻止更烦人了 . 应在CI服务器或部署系统中进行任何进一步的检查 .
我们现在使用预提交钩子来检查代码和提交消息 .
开发人员可以使用
-n
跳过它们,但他们很少这样做,我们总是有另一个开发人员在做QA,所以事情会被注意到 .钩子很重要,因为它会在文件被破坏时发现,因此破解的PHP或JS根本不会被提交 .
在https://github.com/netresearch/git-client-hooks找到他们的钩子代码
我们使用中央服务器进行开发,我们的git钩子会自动安装,因为我们提供了一个中央git存储库模板,当你
git clone
或git init
时会自动使用它 .这里提供了一个使用git hook运行PHP linters的方法:https://github.com/stevegrunwell/wp-enforcer
检查此项目:https://github.com/phpro/grumphp它无法安装预接收挂钩,但可能会解决您的跨操作系统预提交挂钩问题 .