黑色作为预提交钩子总是使我的提交失败

black as pre-commit hook always fails my commits

我正在尝试使用 pre-commit to manage Black 作为 Git 预提交挂钩,但我一定是做错了。

在我的预提交配置文件中,我有:

-   repo: https://github.com/psf/black
    rev: 19.3b0
    hooks:
    -   id: black

我期望发生的事情 是 Black 只修改暂存文件,并且提交成功。因为 Black 的全部意义在于它自动执行 Python 代码风格规则,所以没有问题。

当我暂存一个(非 black 兼容的)文件并尝试提交时实际发生了什么:Black 继续修改文件以使其符合预期。 .. 但问题是它 returns 一个“失败”。所以提交失败。然后我必须取消暂存文件,然后在再次提交之前重新暂存它……只有这样提交才会成功。

这是一个巨大的烦恼,不可能是预期的工作流程?

我做错了什么?

看black的README,你可能想使用--check选项,它只是简单地根据文件是否符合标准退出成功或失败。这将导致在不修改文件的情况下提交失败。

我和你一样。 根据我一直在研究的内容,无法通过预提交挂钩修改提交。

据我所知,接下来最好的就是 bk2204 概述的内容。我们要求 black 阻止任何包含 black 未正确格式化的 python 文件的提交。它仍然确保任何提交都被格式化,但它不会自动为我们格式化文件确实很烦人。

有道理。提交中的任何更改都必须暂存。如果我们可以从 git 钩子中做到这一点,那么我们的问题就会得到解决。通过直接从 git 挂钩修改文件,您已经完成了一半。下半部分将暂存已修改文件的所有更改。但显然... "You cannot amend a commit in a pre commit hook" 这意味着没有分期。

我会评论 bk2204 的回答,但我还没有 50 个代表。

从头开始,这个答案 () 声称可以在预提交挂钩中更改提交。在那种情况下,正在添加文件,所以我敢打赌我们的案例文件可以是 restaged/amended.

(此处为 pre-commit 的作者)

框架有意不提供自动提交修改的方法。这里有一些要求这样的问题:

来自其中一个问题的评论:

pre-commit itself will never touch the staging area. These are good ways to silently break commits. In my mind this is one of the worst things that [other frameworks do and suggest] -- hooks are very frequently not perfect and magically changing what's being committed should not be taken lightly.

That said, if you would like to foot gun, your hook can call git add -u and pre-commit won't know any better :) a sketch of that (untested, discouraged)

  - id: yapf
    entry: bash -c 'yapf "$@"; git add -u' --

(note: using bash will potentially reduce portability)

另评论备注

Fortunately, git add -u && !! is pretty easy to run if you're ok firing from the hip :)

我的一位开发人员提供了一个很好的提示,以防您因黑色(例如由于 single/double 引号)导致提交失败,该提示已通过预提交挂钩解决(例如使用双引号字符串固定器)。你有点像 'nobodies land git situation'。暂存文件中有一个更改的文件,但无法通过预提交挂钩提交,git 状态不会看到任何更改,但提交失败(我认为这是一个真正的黑洞)。你只会在提交时失败,但什么也做不了(除了这个文件的重置头)。一旦你处于这种情况并且运行:使用commit -m 'Resolving pre-commit-hook changes' --no-verify ..... tada!:它已解决。

根据我的经验,不需要 unstage 任何文件,只需 git add 黑色的文件,或其他 pre-commit 挂钩,再次修改 这将在阶段区域 commit 中使用与之前相同的消息覆盖它们 除非错误与提交消息检查有关。

如果您的提交包括 所有 的更改文件,那么只需将提交命令从 git commit -m "Your commit message" 更改为 git commit -am "Your commit message" 即可很好地完成工作。