Git:使用PHP_CodeSniffer预接收挂钩

时间:2011-05-25 06:22:01

标签: php git coding-style codesniffer

自从SVN切换到Git后,我们失去了通过subversion服务器上的pre-commit钩子强制执行编码标准的能力。

使用Git,您只能在客户端cannot be enforced以任何方式预先提交挂钩。更糟糕的是,我们让开发人员使用所有三个主要操作系统,因此在Linux或OS X上运行的预提交挂钩不会自动在Windows上运行。

要做的就是在服务器上实现pre-receive挂钩,但解决方案并不像看起来那么容易:

想象一下,开发人员做了20次提交并想要推送它们。我知道的所有预提交和预接收挂钩(12)只检查单个提交,这最终会失败并阻止推送。现在,开发人员修复了问题并进行了另一次提交,并尝试再次推送。由于钩子检查单个提交,它将再次失败。

所以我们需要一个pre-receive钩子,它会在所有要推送的提交中生成所有已更改文件的列表,并仅在当前状态下运行phpcs。

这样的钩子脚本是否已存在?在哪里?

编辑:似乎有一个script that creates that list of files - 不幸的是在Python中,但可以移植。我仍然对使用PHPCS的预制解决方案感兴趣:)

13 个答案:

答案 0 :(得分:2)

我宁愿不等待服务器端挂钩来控制推送。

您可以设置一个中间仓库,定期获取每个开发人员的分支并审核每个新提交,如果提交无法满足某些预定义标准,则发送电子邮件。

您也可以在中央仓库上预先接收挂钩,但至少开发人员会更早发现潜在问题。

答案 1 :(得分:2)

我没有说好'git-anese',但在Mercurial中有一个名为'changegroup'的钩子选项,它基本上检查了一组传入提交的'top'提交。也许社区中的某个人可以告诉你是否存在等价物。 git的'changegroup'是什么?

https://www.mercurial-scm.org/wiki/Hook#The_changegroup_hook

答案 2 :(得分:2)

我认为这里没有技术解决方案,但如果你真的想打扰人,那么将phpcs集成到您的CI设置中并开始在您的问题管理器中打开它的门票。 ; - )

我认为这不是最好的主意,因为它确实不是技术问题。你的问题不是提前或提交后的钩子,而是人们不这样做,你认为你必须强迫它们。

总而言之,我理解编码标准的重要性,我也强制执行,但是它有社交组件(或方面)。

听起来和你一起工作的人要么不知道更好(还是)还是不愿意学习。所以,如果他们不知道更好,你必须与他们合作并教他们遵守你的要求。这包括教他们为什么惯例很重要,最后他们需要了解在一切都是绿色之前不会完成一项功能。

也许这需要项目管理(我收集的是你)将问题分解为多个任务,直到他们得到它:

  • 功能本身
  • phpcs
  • 文档
  • 单元测试

(没有具体的顺序。; - ))

如果他们不愿意学习,你总是可以采取更激烈的措施。就像,我会慢慢开始,每周进行一次性能评估(1对1的情况)并重申为什么他们不这样做。如果这没有帮助 - 我想你会抓住我的漂移。

答案 3 :(得分:2)

在Drupal项目中,我们最近迁移到Git并正在研究类似的问题。在我们的例子中,我们不希望任何人在LICENSE.txt文件中检查模块,因为我们的打包脚本会自动执行此操作。经过一些来回,我们想出的是一个不拒绝错误提交的接收挂钩,但每次检测到错误提交(对于某些“坏”定义)它会自动在我们的错误中提出一个关键错误跟踪器。这样代码仍然可以提交,但是模块维护者和相应的网站管理员团队都会立即收到通知,告知有问题,应该修复。您可以轻松发送电子邮件或发送推文或其他任何您想要的通知。

实际上我们还没有实现,但这是我们Git实施团队有时间的时候我们正在制定的计划。 : - )

基本上,除了改述之外,你所描述的问题没有好的解决办法;它不是“阻止可检测到的违规”,而是“报告可检测到的违规行为”。我认为这是你能做的最好的事情。

答案 4 :(得分:2)

使用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

泰瑞尔

答案 5 :(得分:1)

也许这个问题的答案有帮助吗? Git pre-receive hook

答案 6 :(得分:1)

我用过这个钩子: http://criticallog.thornet.net/2011/06/02/running-php-linter-before-pushing-changes-to-a-git-repository/

并修改它以使用phpcs测试代码。

可能包含一些错误,我有硬编码的drupal代码标准,但它的工作原理! http://pastebin.com/fEmN519B

答案 7 :(得分:0)

我没有使用预先提交/预先接收挂钩等直接回答这个问题。

我从另一个方面处理这个问题,运行一个CI服务器,(我使用jenkins)运行phpcs和Jenkins的checkstyle插件。

这使我可以根据checkstyle报告使构建失败并通过电子邮件发送提交者。

可选择我可以设置阈值,因此如果最多有5个新样式违规,我会得到一个不稳定的构建,但如果提交的样式超过5则会失败。

此外,我可以设置总体阈值,因此整个项目中超过10次违规会导致失败并向团队发送电子邮件。

如上所述,这可能是您的中间服务器。 post构建操作可以包括Push to another git repo。

答案 8 :(得分:0)

我们使用git包装器(为了我们的目的替换git-submodules更加理智)并且它具有从魔术目录自动设置预提交挂钩的副作用。由于这是在商业环境中,没有抱怨(并且有办法将其关闭)。

答案 9 :(得分:0)

我也试过这个。我目前没有手头的代码,但我使用其中一个钩子(不是预先接收,我认为是更新一个)来临时检查新的ref。你可以通过一个只需要更新的签出树来加快速度,只需要做一些浅克隆。

这允许访问整个源代码树,您不仅可以在通过推送更改的文件上运行CS,还可以运行单元或冒烟测试。

我也同意其他一些评论,这些测试应该保持在最低限度,因为没有什么比被挂钩阻止更烦人了。应在CI服务器或部署系统中进行任何进一步的检查。

答案 10 :(得分:0)

我们现在使用预提交钩子来检查代码和提交消息。

开发人员可以使用-n跳过它们,但他们很少这样做,我们总是让其他开发人员进行质量检查,以便让人注意到。

钩子很重要,因为它会在文件被破坏时发现,因此破坏的PHP或JS根本不会被提交。

https://github.com/netresearch/git-client-hooks

找到他们的钩子代码

我们使用中央服务器进行开发,我们的git挂钩会自动安装,因为我们提供了一个中央git存储库模板,可以在git clonegit init时自动使用。

答案 11 :(得分:0)

  

这样的钩子脚本是否已存在?在哪里?

此处提供了使用git hook运行PHP linters的方法:https://github.com/stevegrunwell/wp-enforcer

答案 12 :(得分:-1)

检查此项目:https://github.com/phpro/grumphp 它无法安装预接收挂钩,但可能会解决您的跨操作系统预提交挂钩问题。