10

我试图在我的 git diff 中仅更改文件的预提交挂钩中运行 flake8,同时也排除我的配置文件中的文件。

files=$(git diff --cached --name-only --diff-filter=ACM);
if flake8 --config=/path/to/config/flake8-hook.ini $files; then
    exit 1;
fi

我基本上想做:

flake8 --exclude=/foo/ /foo/stuff.py

然后让 flake8 跳过我传入的文件,因为它在排除变量中。

我还希望它排除不是 .py 文件的文件。例如:

flake8 example.js

现在我正在测试,这些都不起作用。有人有想法么?

4

4 回答 4

12

如果您所追求的是在未提交和暂存的 python 文件上运行 flake8 并进行更改,那么这个单行代码就可以解决问题:

flake8 $(git status -s | grep -E '\.py$' | cut -c 4-)

git status 列出改变的文件,grep for python,用cut去掉开头的M/S位。

要使其成为预提交挂钩,您需要添加 shell hashbang:

#!/bin/sh flake8 $(git status -s | grep -E '\.py$' | cut -c 4-)

将其保存为 .git/hooks/pre-commit,chmod +x。

于 2016-05-24T14:16:28.797 回答
0

如果您想flake8在提交前检查文件,只需使用

$ flake8 --install-hook git

参考:https ://flake8.pycqa.org/en/latest/user/using-hooks.html

于 2019-09-07T21:50:58.123 回答
0

你的问题有两个部分:

1. 仅在我的 git > diff 中更改的文件上在预提交挂钩中运行 flake8

为了flake8仅在 diff 文件(已暂存)上运行,我将.git/hooks/pre-commit脚本修改如下:

#!/bin/sh
export PATH=/usr/local/bin:$PATH  
export files=$(git diff --staged --name-only HEAD)  
echo $files  
if [ $files != "" ]  
then  
    flake8 $files  
fi

我使用的export PATH=/usr/local/bin:$PATH是我通常从 sourceTree 提交的,它不会选择 flake8 所在的路径

--staged选项只允许拾取暂存区域中的文件

第二部分:

2.排除我的配置文件中的文件

您可以在存储库根目录中创建一个.flake8可以处理此问题的文件。我的.flake8文件如下所示:

[flake8]  
ignore = E501  
exclude =  
        .git,  
        docs/*,  
        tests/*,  
        build/*  
max-complexity = 16

希望这可以帮助。

于 2017-03-24T17:06:10.487 回答
0

有一个项目lint-diffs仅在 diff 文件上运行 linter,并将结果与​​ diff 输出匹配。

它适用于 flake8 和 pylint。此外,它只能在 diffs 中的行上报告 linter 错误……或在更改的文件中的所有行上报告。

于 2019-12-16T22:54:28.220 回答