pre-commit
故意设计为反对集中管理,因为它无法在不破坏大量存储库的情况下升级集中配置。例如,我们在 yelp 管理数百个存储库,当系统团队升级 flake8 时,其中很大一部分会损坏!预提交的核心是为可重复性和每个存储库定制而设计的。它提供了一种机制使这种方式更容易:pre-commit autoupdate
. 您还可以使用分布式重构工具,例如 all-repos(具有直接pre-commit
支持)对配置进行全面更改(并在存储库中测试每个单独的存储库)。
也就是说,该设计为您提供了相当多的逃生舱口,以允许不受支持的路径可以完成您正在寻找的东西。您链接的问题实际上包含许多这些解决方案(这是我一直试图积累它们的地方!) - 不过我会在这里重申它们。
使用“预提交中的预提交”
归根结底,pre-commit
它只是一个调用可执行文件的工具,为什么那个可执行文件不能pre-commit
呢?(它可以)
布局
$ tree -I .git -a ../testrepo/
../testrepo/
├── .pre-commit-hooks.yaml
├── orghooks.yaml
└── run-org-hooks
0 directories, 3 files
.pre-commit-hooks.yaml
- id: org-hook
name: org-wide hooks
language: script
entry: ./run-org-hooks
verbose: true
verbose: true
无论事情是否通过,都强制输出始终出现
./run-org-hooks
(模式0755
:)
#!/usr/bin/env python
import os
import sys
HERE = os.path.dirname(os.path.realpath(__file__))
def main():
cfg = os.path.join(HERE, 'orghooks.yaml')
cmd = ['pre-commit', 'run', '--config', cfg, '--files'] + sys.argv[1:]
os.execvp(cmd[0], cmd)
if __name__ == '__main__':
exit(main())
请注意,我们使用 pre-commit 的--config
选项作为一种“包含”。 在这里很重要,这样才能尊重--files
顶级。pre-commit run --files ...
orghooks.yaml
(基本上任何旧的.pre-commit-config.yaml
!)
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- repo: https://github.com/asottile/add-trailing-comma
rev: v1.5.0
hooks:
- id: add-trailing-comma
消费存储库
.pre-commit-config.yaml
(注意,我在这里使用本地路径和 sha,因为我想测试这个想法,实际上你会将它放在可克隆的存储库中并使用标签)
repos:
- repo: /tmp/wat/testrepo
rev: 2d76bfbfddde6129c4ec5db31ac08abfbe362114
hooks:
- id: org-hook
跑步
$ pre-commit run --all-files
org-wide hooks...........................................................Passed
hookid: org-hook
Trim Trailing Whitespace.................................................Passed
Fix End of Files.........................................................Passed
Add trailing commas......................................................Passed
$ pre-commit run --files README.md
org-wide hooks...........................................................Passed
hookid: org-hook
Trim Trailing Whitespace.................................................Passed
Fix End of Files.........................................................Passed
Add trailing commas..................................(no files to check)Skipped
$ SKIP=trailing-whitespace pre-commit run --files setup.py
org-wide hooks...........................................................Passed
hookid: org-hook
Trim Trailing Whitespace................................................Skipped
Fix End of Files.........................................................Passed
Add trailing commas......................................................Passed
符号链接
目前没有什么要求.pre-commit-config.yaml
是常规文件。你可以让它成为一个符号链接
关于符号链接如何实现这一点的一些想法:
- 与工作存储库相邻的常规克隆存储库 (
.pre-commit-config -> ../convention/pre-commit-config.yaml
)
- 配置管理托管文件 (
.pre-commit-config.yaml -> /etc/pre-commit/pre-commit-config.yaml
)
- 子模块 (
.pre-commit-config.yaml -> submodule/pre-commit-config.yaml
)
不要为/ 等使用pre-commit install
和使用自己的 shell 脚本。.git/hooks/pre-commit
pre-commit install
是一种方便,但不是工作所必需的。它〜本质上是一个包装器pre-commit run
,您可以轻松地将该脚本替换为调用pre-commit run --config /etc/pre-commit/pre-commit-config.yaml
.
免责声明:
- 我是作者
pre-commit
- 我是作者
all-repos