1

我有一个这样的回购:

myrepo/
      .git
      tool1/  
           src/main.py
           tests/test.py
           .pre-commit-config.yaml

配置在哪里:

repos:
- repo: local
  hooks:
    - id: pytest-cov
      name: pytest coverage
      stages: [push]
      language: system
      entry: pwd  # originally: pytest testtool --cov --cov-fail-under=0 
      types: [python]
      pass_filenames: false

将条目更改为“pwd”只是为了查看 basedir 在预提交的上下文中是什么。现在,当我从 myrepo/tool1 目录运行它时pre-commit run --hook-stage=push --verbose,pwd 会说“myrepo”,而不是“myrepo/tool1” . 我需要在 tool1 中运行,因为所有路径等都是相对的。

是否有一些设置或其他方式来运行预提交,以便基本目录是 myrepo/tool1?还是该项目真的必须存在于回购的根目录中?

4

1 回答 1

6

正如您所见,您可以将配置放在任何地方,但 git 挂钩本身总是从存储库的根目录运行(这就是git工作原理)。每个存储库也只有一组 git 钩子,因此 monorepo 的功能对 git 钩子没有意义

跟踪器上有一些有趣的问题:pre-commit/pre-commit/issues search:monorepo

建议是围绕任何有问题的工具编写一个包装器,并cd在需要更改工作目录时使用——例如从#1417开始:

-   repo: local
    hooks:
    -   id: go-unit-tests
        name: run go test s(go test)
        language: system
        entry: bash -c 'cd subdir && exec go test ./...'
        pass_filenames: false
        types: [go]
        files: ^subdir/

免责声明:我是 pre-commit 的作者

于 2020-11-10T16:58:25.890 回答