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 validate和puppet-lint检查Puppet文件
使用flake8或pycodestyle和pyflakes检查Python文件
使用rubocop检查Ruby文件
使用shellcheck检查shell脚本
使用eslint、jshint、jscs或standard检查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的散列
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f89d559b0272c2f5ac752ad9f336440e7cd955dd1080f1e6e0dc08cf880b48c5 |
|
MD5 | 8cb4037acf9bbeecfc35921f6558c194 |
|
BLAKE2b-256 | 77e42cdd025983c81073683422bb5fdb98756e6d7c80d7ecc056acb5b7d2169f |