如何对git ls文件中的所有文件运行命令?

如何对git ls文件中的所有文件运行命令?,git,bash,shell,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 ==="

我们有一个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
但是,有一些东西要么没有签入,要么
.gitignore
ed。因此,我想获取
git ls文件的输出,并仅在这些文件上运行命令。我可以循环,但我不想对开发人员选择的shell进行假设。理想情况下,我希望通过设置与
git ls文件的差异来过滤
查找
s输出

#!/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
我应该帮你

git ls files-z
xargs-0
允许在文件名中使用空格等

xargs
man

-0,--null

输入项以空字符而不是空格结尾,引号和反斜杠并不特殊(每个字符都是按字面意思)。禁用文件结尾字符串,该字符串与任何其他参数一样处理。当输入项可能包含空格、引号或反斜杠时非常有用。GNU查找
-print0
选项 产生适合此模式的输入

git ls文件
man

-z

\输出上的0行终止

如果您只需要特定的文件扩展名 我很惊讶,因为我有大量的代码行,结果证明这是因为.png文件和其他意义不大的文件

如果您只查找某些扩展(在我的示例中是dart、py和c),请查找以下脚本以方便您使用:

因此,基本上,如果java是您的主扩展文件(/trigger all the javahatters and lowers),则将java放入转义序列中:

git ls-files | grep -e "\.\(java\)$" | xargs wc -l
(复制/粘贴并用当前主文件扩展名替换java)

然后添加:

\|file_extension

在第一个扩展名之后(在本例中是在java中的“a”之后),为您还希望分析的每个后续文件扩展名添加管道。

xargs
git ls files | xargs foo
pep8
工具可以在命令行上获取目录名,并支持
--exclude
--filename
选项,以提供包含和排除的模式。在许多情况下,这足以选择要检查的文件。
\|file_extension