如何从git ls-files对所有文件运行命令?

oar*_*ish 2 git bash shell

我们有一个CI脚本,可以对存储库中的所有Python文件进行样式检查,如下所示:

#!/usr/bin/env bash
find . -name \*.py -exec pep8 --ignore=E402 --max-line-length=120 {} +
if [ $? -ne 0 ]; then
    >&2 echo "=== PEP8 errors need to be solved ==="
else
    echo "=== PEP8 check ok ==="
fi
pytest
Run Code Online (Sandbox Code Playgroud)

但是,有一些事情要么没有签入,要么被.gitignore编辑.所以我想获取输出git ls-files并仅在那些上运行命令.我可以循环,但我不想对开发人员选择的shell做出假设.理想情况下,我想find通过设置差异来过滤s输出git ls-files.

exu*_*sum 5

#!/usr/bin/env bash
git ls-files -z \*.py | xargs -0 pep8 --ignore=E402 --max-line-length=120
if [ $? -ne 0 ]; then
    >&2 echo "=== PEP8 errors need to be solved ==="
else
    echo "=== PEP8 check ok ==="
fi
pytest
Run Code Online (Sandbox Code Playgroud)

你应该做的.

git ls-files -zxargs -0允许文件名中的空格等

来自那个xargs男人

-0, --null
输入项由空字符而不是空格终止,引号和反斜杠不是特殊的(每个字符都是字面意思).禁用文件字符串的结尾,该字符串与任何其他参数一样.输入项可能包含空格,引号或反斜杠时很有用.GNU查找-print0 选项生成适合此模式的输入.

来自那个git ls-files男人

-z
\0输出上的行终止.