如何将预提交工具配置为依赖于所有挂钩配置的单个位置?

sor*_*rin 7 pre-commit.com

请注意,这个问题是关于pre-commit.com工具,而不是关于安装 git-hooks。

该工具在存储库的根目录中使用.pre-commit-config.yml一个文件,该文件定义要使用哪些挂钩,并使用 git 标签固定它们。固定很有用,因为它可以避免在发布新的钩子/linter 时引入随机损坏。

如果您有大量存储库(> 40)并且您的钩子正在积极开发,这会带来新的挑战。在已经采用预提交工具的 OpenStack 存储库上,这造成了新的维护负担,而且是一项重大负担,尤其是每个补丁在 CI 上花费的平均时间超过 5 小时。

配置预提交以使用 HEAD 也不是一个选项,因为这会经常破坏。时间

因此,我想知道是否有另一个设置可以让我拥有一个定义其配置的集中式预提交存储库,并且我可以配置大多数项目来使用它。

如果可能的话,它会从一个地方碰撞短绒。我们可以毫无问题地破坏一些存储库,因为如果我们愿意,我们可以触发其他存储库上的构建,或者我们可以承担风险。

还有另一个方面,一些 linter 确实需要自己的配置文件,例如.ansible-lint.flake8文件,如果我们也可以将这些文件保存在一个集中位置,那就太好了。这方面的问题更大,因为将有许多存储库,我们将被迫更改默认配置。这意味着它的唯一工作方式是仅当没有仓库内配置时才使用集中式 linter 配置。

我怎样才能做到这一点?

请注意,任何解决方案都不应改变用户已经进行 linting 的方式(tox -e linters即调用pre-commit run -a)。要求用户手动克隆另一个存储库或运行一个具有某些魔力的 bash 脚本将是一个破坏性的事情,因为它会引入另一个需要维护的东西。

背景

Ant*_*ile 14

pre-commit是专门针对集中管理而设计的,因为它使得在不破坏大量存储库的情况下升级集中配置变得不可能。例如,我们在 yelp 管理了数百个存储库,当系统团队升级 flake8 时,其中很大一部分会崩溃!预提交的核心是为了可重复性和每个存储库的定制。它提供了一种使这种方式变得更容易的机制:pre-commit autoupdate。您还可以使用分布式重构工具,例如 all-repos(具有直接pre-commit支持)对配置进行彻底更改(并在存储库中测试每个单独的存储库)。

\n\n

也就是说,该设计为您提供了相当多的逃生舱口,以允许不受支持的路径来实现您正在寻找的东西。事实上,您链接的问题包含许多这样的解决方案(这是我一直试图积累它们的地方!)——不过我会在这里重申它们。

\n\n
\n\n

使用“预提交中的预提交”

\n\n

归根结底,pre-commit它只是一个调用可执行文件的工具,为什么不能是可执行文件呢pre-commit?(它可以)

\n\n

布局

\n\n
$ tree -I .git -a ../testrepo/\n../testrepo/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .pre-commit-hooks.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 orghooks.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 run-org-hooks\n\n0 directories, 3 files\n
Run Code Online (Sandbox Code Playgroud)\n\n

.pre-commit-hooks.yaml

\n\n
-   id: org-hook\n    name: org-wide hooks\n    language: script\n    entry: ./run-org-hooks\n    verbose: true\n
Run Code Online (Sandbox Code Playgroud)\n\n

verbose: true强制输出始终出现,无论事情是否通过

\n\n

./run-org-hooks(模式:0755

\n\n
$ tree -I .git -a ../testrepo/\n../testrepo/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .pre-commit-hooks.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 orghooks.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 run-org-hooks\n\n0 directories, 3 files\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,这里我们使用预提交选项--config作为一种“包含”。 --files在这里很重要,因此顶级pre-commit run --files ...会受到尊重。

\n\n

orghooks.yaml(基本上任何旧的.pre-commit-config.yaml!)

\n\n
repos:\n-   repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v2.4.0\n    hooks:\n    -   id: trailing-whitespace\n    -   id: end-of-file-fixer\n-   repo: https://github.com/asottile/add-trailing-comma\n    rev: v1.5.0\n    hooks:\n    -   id: add-trailing-comma\n
Run Code Online (Sandbox Code Playgroud)\n\n

消费存储库

\n\n .pre-commit-config.yaml\n\n

(注意,我在这里使用本地路径和 sha,因为我想测试这个想法,实际上,您可以将其放入可克隆存储库并使用标签)

\n\n
repos:\n-   repo: /tmp/wat/testrepo\n    rev: 2d76bfbfddde6129c4ec5db31ac08abfbe362114\n    hooks:\n    -   id: org-hook\n
Run Code Online (Sandbox Code Playgroud)\n\n

跑步

\n\n
$ pre-commit run --all-files\norg-wide hooks...........................................................Passed\nhookid: org-hook\n\nTrim Trailing Whitespace.................................................Passed\nFix End of Files.........................................................Passed\nAdd trailing commas......................................................Passed\n\n$ pre-commit run --files README.md\norg-wide hooks...........................................................Passed\nhookid: org-hook\n\nTrim Trailing Whitespace.................................................Passed\nFix End of Files.........................................................Passed\nAdd trailing commas..................................(no files to check)Skipped\n\n$ SKIP=trailing-whitespace pre-commit run --files setup.py\norg-wide hooks...........................................................Passed\nhookid: org-hook\n\nTrim Trailing Whitespace................................................Skipped\nFix End of Files.........................................................Passed\nAdd trailing commas......................................................Passed\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

符号链接

\n\n

目前没有任何要求.pre-commit-config.yaml是常规文件。你可以把它变成一个符号链接

\n\n

关于符号链接如何实现此目的的一些想法:

\n\n
    \n
  1. 与工作存储库相邻的传统克隆存储库 ( .pre-commit-config -> ../convention/pre-commit-config.yaml)
  2. \n
  3. 配置管理管理文件 ( .pre-commit-config.yaml -> /etc/pre-commit/pre-commit-config.yaml)
  4. \n
  5. 子模块 ( .pre-commit-config.yaml -> submodule/pre-commit-config.yaml)
  6. \n
\n\n
\n\n

不要使用pre-commit install和使用你自己的 shell 脚本来进行.git/hooks/pre-commit/ 等。

\n\n

pre-commit install是一种方便,但不是工作必需的。它本质上是一个包装器pre-commit run,您可以轻松地将该脚本替换为调用pre-commit run --config /etc/pre-commit/pre-commit-config.yaml.

\n\n
\n\n

免责声明:

\n\n
    \n
  • 我是作者pre-commit
  • \n
  • 我是作者all-repos
  • \n
\n