如何通过 pre-commit.com 从预提交挂钩中排除未跟踪/新文件?

How to exclude untracked / new files from pre-commit hook via pre-commit.com?

我们正在使用 pre-commit.com 框架为我们的 python 项目配置预提交挂钩。暂存一组文件以供提交时,应将预提交挂钩应用于存储库的状态,其中这些暂存文件为 included/modified,而不应包括对未暂存文件的所有修改。这适用于被修改的文件,但不适用于新文件/未跟踪的文件。如果我创建一个新文件并修改一些现有文件,然后只想将更改提交到修改后的文件,而不是(还)提交到新文件,那么预提交挂钩也会应用于新文件。这通常会导致挂钩失败,因为应用挂钩的回购状态不一致。

是否有任何配置选项/cmd 行参数来预先提交以在应用挂钩时从回购中排除未跟踪的文件?

除了暂时从存储库中删除新文件之外,还有其他方法可以解决这个问题吗?

我已经尝试将新文件标记为打算使用 git add -N <new_file> 提交,这没有帮助,但会导致警告:

[WARNING] Unstaged intent-to-add files detected.

预提交版本:2.10.1

示例:

考虑具有以下内容的 git 回购:

|-- .git
|-- .pre-commit-config.yaml
`-- foo
    `-- existing_file.py

其中文件 foo/existing_file.py 具有以下内容:

# cat foo/existing_file.py 
a = 1 + 1

预提交挂钩已通过以下方式安装:

pre-commit install

预提交挂钩配置为 运行 flake8:

# cat .pre-commit-config.yaml 
default_language_version:
  python: python3.8
default_stages: [commit]
repos:
  - repo: local
    hooks:
      - id: flake8
        name: flake8
        entry: flake8
        always_run: true
        files: $^
        language: system

现在,我对文件 foo/existing_file.py 进行了更改并添加了新文件 foo/new_file.py。在这些更改之后,文件具有以下内容:

# cat foo/existing_file.py 
a = 1 + 2
# cat foo/new_file.py 
import math

现在,我想提交对 foo/existing_file.py 所做的更改,而不是 new/untracked 文件 foo/new_file.py。因此,我暂存 foo/existing_file.py,而 foo/new_file.py 仍未跟踪。

# git add foo/existing_file.py
# git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   foo/existing_file.py

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    foo/new_file.py

如果我现在尝试提交,flake8 returns 文件 foo/new_file.py 中的错误未包含在提交中:

# git commit
flake8...................................................................Failed
- hook id: flake8
- exit code: 1

./foo/new_file.py:1:1: F401 'math' imported but unused

您的配置避开了框架并始终在所有文件上运行。在这种情况下,预提交只是做你告诉它做的事情

我的建议是不要像您正在使用的那样使用 always_run(您的 files: $^ 最好写成 pass_filenames: false

该框架的一个要点是它只将必要的文件传递给您的工具,因此您只检查已签入的内容,当您删除该功能时,您现在正在检查存储库中的所有内容(甚至是未签入)

使用 flake8 的推荐方法是通过以下配置:

-   repo: https://github.com/PyCQA/flake8
    rev: 3.9.0
    hooks:
    -   id: flake8

免责声明:我创建了预提交并且我是 flake8 当前的主要维护者