跳转到主要内容

Git pre-receive钩子,用于检查提交和代码风格

项目描述

反复编辑文件以保持一致的风格非常耗时。该项目提供Git pre-receive钩子,用于在Git服务器端验证推送的提交。该钩子通过拒绝任何不符合规则的提交来避免所有问题,从而从一开始就阻止它们进入存储库。

pre-receive钩子会自行对提交进行一些检查,并在服务器的PATH上查找特定编程语言的语法检查器,以使用它们检查更改的文件。这个过程非常快,因为只有推送提交中添加和修改的文件才会传递给语法检查器,也是并行进行的。除非您的提交涉及数百个文件,否则这不会减慢您的工作速度。

安装

可以使用pip安装此工具。

pip install igcommit

脚本链接到Git服务器上您的Git仓库的hooks/pre-receive

ln -s igcommit-receive /home/git/repositories/myproject.git/hooks/pre-receive

功能

  • 逐个验证接收到的提交,而不仅仅是最后一个

  • 仅验证提交中添加或修改的文件

  • 在失败之前报告所有问题

  • 检查重复的提交摘要

  • 检查误导性的合并提交

  • 验证提交者和作者的日期和时间戳

  • 验证提交者和作者的名字和电子邮件地址

  • 检查提交信息的最佳实践(80行,第一行摘要…)

  • 检查提交摘要的格式

  • 验证提交标签与列表[BUGFIX][FEATURE][WIP]

  • 检查更改的文件路径

  • 接受标记为[HOTFIX][MESS][TEMP][WIP]的提交,其中包含问题

  • 检查可执行位和shebangs

  • 检查符号链接

  • 使用csslint检查CSS文件

  • 使用golint检查Go文件

  • 使用htmlhint检查HTML文件

  • 使用puppet parser validatepuppet-lint检查Puppet文件

  • 使用flake8pycodestylepyflakes检查Python文件

  • 使用rubocop检查Ruby文件

  • 使用shellcheck检查shell脚本

  • 使用eslintjshintjscsstandard检查JavaScript文件

  • 使用coffeelint检查CoffeeScript文件

  • 使用phpcs检查PHP文件

  • 并行运行外部检查命令

  • 验证JSON、XML、YAML文件格式

以下是一个示例问题输出

=== CheckDuplicateCommitSummaries on CommitList ===
ERROR: summary "Add nagios check for early expiration of licenses" duplicated 2 times

=== CheckCommitSummary on 31d0f6b ===
WARNING: summary longer than 72 characters

=== CheckCommitSummary on 6bded65 ===
WARNING: past tense used on summary

=== CheckCommand "flake8" on src/check_multiple.py at 6bded65 ===
INFO: line 10 col 5: E225 missing whitespace around operator
INFO: line 17 col 80: E501 line too long (122 > 79 characters)
INFO: line 17 col 85: E203 whitespace before ','

=== CheckCommitMessage on 6fdbc00 ===
WARNING: line 7 is longer than 80
WARNING: line 9 is longer than 80

配置

脚本本身目前没有配置。尽管如此,脚本中调用的某些语法检查器使用或需要配置。这些配置文件必须放在Git仓库的顶层。

语法检查器

配置文件

coffeelint

coffeelint.json,或package.json

可选

csslint

.csslintrc

可选

eslint

eslint.(js|yaml|yml|json),或package.json

必需

flake8

.flake8,setup.cfg,或tox.ini

可选

htmlhint

.htmlhintrc

可选

jscs

.jscsrc,.jscs.json,或package.json

必需

jshint

.jshintrc,或package.json

可选

phpcs

phpcs.xml,或phpcs.xml.dist

可选

puppet-lint

.puppet-lint.rc

可选

pycodestyle

setup.cfg,或tox.ini

可选

rubocop

.rubocop.yml

可选

预接收钩子的优缺点

持续集成服务器

持续集成服务器可以在执行许多其他任务的同时运行此类检查。将此任务从其中移除具有许多好处

  • 同步反馈

  • 更有效

  • 不允许任何违反规则的提交

预提交钩子

尽管预接收钩子比预提交钩子给出更晚的反馈,但它相对于预提交钩子有许多优点

  • 无需客户端配置

  • 插件只需安装到Git服务器一次

  • 每个人都接受相同的检查

  • 强制执行,没有人可以跳过检查

  • 提交检查(预提交钩子只获取提交中更改的内容)

IDE集成

与预提交钩子相同的优点也适用于IDE集成。尽管如此,IDE集成提供了更早和更友好的反馈,因此即使在预接收钩子中,这也是一个好主意。

依赖关系

脚本不依赖于Python 3.4或更高版本。脚本使用shell执行验证命令。检查仓库所需的相关命令需要单独安装。请参阅config.py上的完整命令列表。不在PATH上的命令将不会使用。

测试

我发现检查脚本在不同的Git仓库上激活时会提出什么抱怨很有用。您可以在Git仓库内部运行以下命令来测试最后50次提交

git log --reverse --oneline HEAD~50..HEAD |
    sed 's:\([^ ]*\) .*:\1 \1 refs/heads/master:' |
    python ../igcommit/igcommit-receive

变更

版本2.0
  • 修复可执行文件语法错误时的行号问题(偏移1行)

  • 识别和验证符号链接

  • 验证提交者和作者的日期和时间戳

  • 验证贡献者的姓名和电子邮件地址

  • 减少提交消息行长度限制

  • 对可执行文件的文件扩展名提出抱怨

版本2.1
  • 将[TEMP]添加到可识别的提交标签中

  • 修复获取初始提交更改的问题(郑伟)

  • 修复各种文件描述符泄漏

  • 更严格地检查提交摘要

  • 检查非可执行文件的shebang

  • 不要检查空文件的内容

  • 提高Python 2上的Unicode支持

  • 修复检查符号链接目标

版本2.2
  • 修复eslint配置(Jerevia)

  • 接受带有[TEMP]的问题提交

  • 停止跳过空文件

  • 确保不要获取未知文件的内容

  • 将文件扩展名移动到配置中

  • 将时间戳比较容差增加1分钟

  • 处理shebang中的空格

版本2.3
  • 处理检查命令立即失败

  • 支持推送到标签

  • 修复文件检查返回错误代码时的失败问题

  • 在警告中包含提交标签列表

  • 修复识别提交标签[REVIEW][SECURITY]

版本2.4
  • 修复识别已删除的配置文件

  • 支持coffeelint

版本2.5
  • 修复Python 2上XML、YAML和JSON的Unicode问题(jcoetsie)

版本3.0
  • 放弃Python 2支持

  • 修复处理包含空格的文件名问题(Friz-zy)

版本3.1
  • 停止对Git标签上的相同提交抱怨

  • 修复检查贡献者姓名和电子邮件地址

  • 停止对我们不了解的文件扩展名抱怨

  • 过滤出检查templates/目录下文件的格式

  • 提高代码质量和样式

版本3.2
  • 将合并提交摘要长度的严重性降低到警告级别

许可协议

该脚本在MIT许可下发布。MIT许可已在开源倡议注册并获得批准[1]

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

igcommit-3.2.tar.gz (21.4 kB 查看散列)

上传时间 源代码

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面