如何在预提交git钩子上运行python包

时间:2019-11-19 19:55:30

标签: python git sh

我如何遍历已更改的文件(git)并将flake8isort包应用于此文件?

git diff --name-only --cached | xargs python -m isort -I

上面的示例不起作用,错误提示unrecognized arguments: -I

我正在pre-commit钩子中尝试此操作。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

当您使用-m标志运行python时,它将终止选项列表。尝试将-I移到-m

之前
git diff --name-only --cached | xargs python -I -m isort

如果您打算将-I传递给isort,则该参数无效。

让我们备份并查看您要解决的问题,而不是专注于此xargs命令和python调用:

  

如何遍历已更改的文件(git)并将flake8和isort软件包应用于此文件?

这是一个示例脚本,我已将其用作预提交钩子的基础:

#!/bin/bash

CD_UP="$(git rev-parse --show-cdup)"
MOD_FILES=($(git status --porcelain | grep -E '^[MARC]' \
             | awk '{print $2}' | tr '\r\n' ' '))
BAD_FILES=()
for MOD_FILE in "${CD_UP}${MOD_FILES[@]}"; do
    <do stuff>
    if <the result of "do stuff" was not good>; then
        BAD_FILES+=("${MOD_FILE}")
    fi
done

for f in "${BAD_FILES[@]}"; do
    echo "File failed pre-commit checks: ${f}"
done

if [ ${#BAD_FILES[*]} != 0 ]; then
  exit 1
fi
exit 0

这将:

  • 找到提交中的更改
  • 将它们放入数组
  • 循环运行,在每个文件上运行一些命令
  • 检查每次检查的结果,并将所有失败的文件添加到BAD_FILES
  • 报告每个失败的文件
  • 如果没有文件失败则退出代码为0(允许git继续提交),如果没有文件失败则退出代码为1(防止git继续提交)

您需要将<do stuff>替换为在flake8上运行isort${MOD_FILE}的命令。您还需要修改循环主体中的if语句,以检查命令的结果并确定文件是否失败或通过。

只需用此脚本(加上您的修改)替换.git/hooks/pre-commit,您就可以了。