black as pre-commit hook 总是让我的提交失败

Jea*_*ett 18 git pre-commit githooks python-black pre-commit.com

我正在尝试使用预提交来管理Black作为 Git 预提交挂钩,但我一定是做错了。

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

-   repo: https://github.com/psf/black
    rev: 19.3b0
    hooks:
    -   id: black
Run Code Online (Sandbox Code Playgroud)

我期望发生的是 Black 只修改暂存文件,并且提交成功。因为 Black 的全部意义在于它自动强制执行 Python 代码样式规则,所以不会提出任何问题。

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

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

我究竟做错了什么?

Ant*_*ile 16

(作者在pre-commit这里)

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

其中一个问题的评论:

pre-commit 本身永远不会触及暂存区。这些是静默中断提交的好方法。在我看来,这是 [其他框架所做的和建议的] 最糟糕的事情之一——钩子经常不完美,并且不应该掉以轻心。

也就是说,如果你想用枪,你的钩子可以调用git add -u并且预提交不会更好:) 草图(未经测试,不鼓励)

  - id: yapf
    entry: bash -c 'yapf "$@"; git add -u' --
Run Code Online (Sandbox Code Playgroud)

(注意:使用bash可能会降低可移植性)

另一个评论说明

幸运的是,git add -u && !!如果你可以从臀部开火,它很容易跑步:)

  • 我不明白这个答案是如何被接受的 - 我就像@Jean-FrançoisCorbett 一样感到困惑。如果不修改暂存中的文件,那么格式化代码的预提交挂钩有什么用? (15认同)
  • 听起来很合理。我很难理解“black”预提交钩子应该做什么/应该如何使用它。因为黑色的全部意义在于它修改文件,没有任何问题。我想这是该钩子的作者的问题。 (6认同)
  • 预提交挂钩的目的是确保格式正确完成。各个开发人员需要确保他们在编辑器上使用相同的代码格式化程序和相同的设置来做到这一点。 (2认同)

bk2*_*204 6

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

  • 我明白你的意思,但这与我想做的相反。我希望黑色只修改文件,并使提交成功。现在在问题中澄清了。 (19认同)

mic*_*mit 6

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

  • 在这种情况下,您的暂存文件仍然有错误的单引号,因为黑色仅修改*工作*文件。为了使 `git commit` 成功,**首先使用 `git add` 进行更改**,否则您将提交错误的单引号。 (2认同)