python pre-commit工具能否将子目录视为项目的基础?

问题描述

我有一个这样的仓库:

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”,只是为了查看baseir在预提交的上下文中。 现在,当我通过pre-commit run --hook-stage=push --verbose从myrepo / tool1目录运行此命令时,pwd将说“ myrepo”,而不是“ myrepo / tool1”。 我需要在tool1中运行,因为所有路径都相对于此。

是否存在一些设置或其他方式来运行precommit,以便基本目录为myrepo / tool1?还是该项目确实必须存在于回购的根源中?

解决方法

您可以将配置放在任何地方,但是git hooks总是从存储库的根目录运行(这就是git的工作方式)。每个存储库中也只有一组git钩子,因此monorepo的功能对于git钩子实际上并没有意义

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

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

-   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/

免责声明:我是预先提交的作者

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...