【问题标题】:How do I run a command on all files from git ls-files?如何对来自 git ls-files 的所有文件运行命令?
【发布时间】:2016-12-11 10:55:11
【问题描述】:

我们有一个 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

但是,有些东西要么没有签入,要么.gitignoreed。所以我想获取git ls-files 的输出并仅在它们上运行命令。我可以循环,但我不想对开发人员选择的 shell 做出假设。理想情况下,我想通过与git ls-files 设置差异来过滤finds 输出。

【问题讨论】:

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

标签: git bash shell


【解决方案1】:
#!/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 行终止输出。

【讨论】:

    【解决方案2】:

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

    我很惊讶,因为我有大量疯狂的代码行,原来是因为 .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”之后)。

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 2015-10-12
      • 2020-01-03
      • 2021-06-19
      • 2020-08-06
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多