如何通过 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 当前的主要维护者
我们正在使用 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 当前的主要维护者