如何在git ls-files中的所有文件上运行命令?

8ljdwjyq  于 2023-08-01  发布在  Git
关注(0)|答案(3)|浏览(149)

我们有一个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-files的输出,并仅在这些输出上运行该命令。我可以循环,但我不想对开发人员选择的shell做出假设。理想情况下,我想通过与git ls-files的设置差异来过滤find的输出。

t98cgbkg

t98cgbkg1#

#!/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 -zxargs -0允许在文件名等中使用空格
来自xargs
-0, --null
输入项以空字符而不是空格结束,引号和反斜杠并不特殊(每个字符都按字面意思理解)。禁用文件字符串的结尾,该字符串与任何其他参数一样被处理。当输入项可能包含白色、引号或反斜杠时很有用。GNU find -print0选项生成适合此模式的输入。
来自git ls-files
-z
\0输出上的线路终止。

j2datikz

j2datikz2#

如果只需要特定的文件扩展名

我很惊讶,因为我有一个疯狂的数量行代码,原来这是因为.png文件和其他文件,并不意味着太多。
如果你只需要某些扩展(在我的例子中,dart,py和c),* 为了方便,请找到下面的脚本 *:

git ls-files | grep -e "\.\(dart\|py\|c\)$" | xargs wc -l

字符串
所以基本上,如果java是你的主扩展文件(/触发所有java的讨厌者和爱好者),你就把java放在转义序列中:

git ls-files | grep -e "\.\(java\)$" | xargs wc -l


(copy/paste并将java替换为当前的主文件扩展名)
然后加上:

\|file_extension


在第一个扩展名之后(在本例中,在java中的'a'之后),您也要分析的每个后续文件扩展名。

r8xiu3jd

r8xiu3jd3#

对存储库中带有文件后缀(扩展名)的所有文件运行命令的简单方法是:

git ls-files -z '*.py' | xargs -0 pep8 --ignore=E402 --max-line-length=120

字符串

相关问题