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

时间:2016-12-11 10:55:11

标签: git bash shell

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

{
    ID: 1000,
    Type: "Ticket",
    "Followers": []
}

但是,有些内容要么未签入,要么#!/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的输出并仅对那些命令运行。我可以循环,但我不想对开发人员选择的shell做出假设。理想情况下,我希望通过与git ls-files的设置差异来过滤find的输出。

2 个答案:

答案 0 :(得分: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

你应该做。

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

来自xargs男人

  

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

来自git ls-files男人

  

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

答案 1 :(得分:0)

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

我很惊讶,因为我有大量的代码行,事实证明是因为.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

(将Java复制/粘贴并替换为当前的主文件扩展名)

然后添加:

\|file_extension

紧随您还要分析的每个后续文件扩展名的第一个扩展名之后(在本例中为Java的'a'之后)。