我准备了以下
pre-commit
挂钩:
#!/bin/sh
# Run flake8 and mypy
flake8 ./src
FLAKE8_EXIT_CODE=$?
mypy ./src
MYPY_EXIT_CODE=$?
# If either flake8 or mypy return an error, skip black and the commit process
if [ $FLAKE8_EXIT_CODE -ne 0 ] || [ $MYPY_EXIT_CODE -ne 0 ]; then
echo "flake8 or mypy checks failed. Skipping black and commit."
exit 1
fi
black .
git add -u
if ! git diff-index --quiet HEAD; then
git commit --no-verify -m "Same message all the times!"
fi
请注意,
black .
重新格式化文件,因此我有第二个git add -u
。为了避免无限递归,我添加了最后一个检查 git commit with --no-verify
,但是每次提交的提交消息都是相同的,我想避免它。相反,当我输入最后一个 if
分支时,我希望收到提交消息提示。
我尝试在最后一个 read
分支中使用 if
命令,但没有成功。
我还想避免使用外部工具作为预提交,但如果可能的话,我宁愿使用本机解决方案。
如何解决?
我建议对 black 执行与 pyflakes 和 mypy 相同的操作:将其作为检查器运行,如果检查器失败则拒绝提交,但实际上不要重新格式化代码。因此,您始终必须手动运行黑色,但它不会在您看到和不知道的情况下重新格式化文件。
black --check ./src
可以做到这一点(如果您愿意,您可以将该检查的输出发送到
/dev/null
以减少提交挂钩噪音)。当检查失败时,它(还)返回一个非零值,表明 black
将重新格式化代码。
但对于你特别想要的东西,也许
git commit --no-verify --amend --no-edit
这样做:它通过修改当前提交来保留最后的提交消息(并且不会打开编辑器来调整提交消息)。