我准备了以下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,但它不会在您不知情的情况下重新格式化文件。
可以做到这一点(如果您愿意,可以将该检查的输出发送到
/dev/null
以减少提交挂钩噪音)。当检查失败时,它(还)返回一个非零值,表示black
将重新格式化代码。但对于你具体想要的东西,也许
这样做的目的是:它通过修改当前提交来保留最后的提交信息(并且不会打开编辑器来调整提交信息)。