4

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

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

如果你有很多存储库(>40)并且你的钩子正在积极开发,这会带来一个新的挑战。在已经采用 pre-commit 工具的 OpenStack 存储库上,这会带来新的维护负担,这是一个重大的负担,尤其是每个补丁在 CI 中花费的平均时间超过 5 小时。

配置预提交以使用 HEAD 也不是一个选项,因为这会经常中断。吨

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

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

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

我怎样才能做到这一点?

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

背景

4

1 回答 1

6

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是常规文件。你可以让它成为一个符号链接

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

  1. 与工作存储库相邻的常规克隆存储库 ( .pre-commit-config -> ../convention/pre-commit-config.yaml)
  2. 配置管理托管文件 ( .pre-commit-config.yaml -> /etc/pre-commit/pre-commit-config.yaml)
  3. 子模块 ( .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
于 2019-11-26T16:38:20.987 回答