Git black as pre-commit钩子总是使我的提交失败

Git black as pre-commit钩子总是使我的提交失败,git,githooks,pre-commit,pre-commit.com,python-black,Git,Githooks,Pre Commit,Pre Commit.com,Python Black,我试图将管理用作Git预提交挂钩,但我一定是做错了 在预提交配置文件中,我有: - repo: https://github.com/psf/black rev: 19.3b0 hooks: - id: black 我期望Black只修改暂存文件,并且提交成功。因为Black的全部要点是它自动执行Python代码风格的规则,所以不会有任何问题 当我准备一个(非黑色兼容)文件并尝试提交时,实际会发生什么情况:黑色继续并修改文件,使其符合预期。。。但问题是它返回一个

我试图将管理用作Git预提交挂钩,但我一定是做错了

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

-   repo: https://github.com/psf/black
    rev: 19.3b0
    hooks:
    -   id: black
我期望Black只修改暂存文件,并且提交成功。因为Black的全部要点是它自动执行Python代码风格的规则,所以不会有任何问题

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

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


我做错了什么?

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

我和你一样。根据我所研究的,提交不能被预提交挂钩修改

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

这是有道理的。提交中的任何更改都必须分阶段进行。如果我们能从git钩子中实现这一点,那么我们的问题就会得到解决。通过直接从git钩子修改文件,您已经完成了一半。下半部分将准备修改文件的所有更改。但显然。。。“您不能在预提交挂钩中修改提交”,这意味着没有转移

我会对bk2204的答案发表评论,但我还没有50个代表

综上所述,这个答案()声称可以在预提交挂钩中更改提交。在这种情况下,将添加文件,因此我打赌在我们的情况下,可以重新存储/修改文件。

pre-commit
的作者)

该框架故意不提供自动提交修改的方法。这里有几个问题需要这样做:

其中一个问题的评论:

预提交本身永远不会触及暂存区域。这些都是无声地破坏提交的好方法。在我看来,这是[其他框架所做和建议的]最糟糕的事情之一——钩子经常不是完美的,不应该掉以轻心地神奇地改变正在发生的事情

这就是说,如果你想走捷径,你的钩子可以调用
git add-u
,而pre-commit就不会知道更好了:)一个草图(未经测试,不鼓励)

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

另一个评论注释

幸运的是,
git add-u&非常容易运行,如果您可以从臀部开火:)


我的一位开发人员提供了一个很好的技巧,以防您由于黑色(例如由于单引号/双引号)而导致提交失败,这是通过预提交挂钩(如双引号字符串修复程序)解决的。你陷入了一种“无名小卒的境地”。暂存文件中有一个已更改的文件,但无法通过预提交挂钩提交,git状态将看不到任何更改,但提交失败(我认为这是一个真正的黑洞)。您只能在提交时失败,但无法执行任何操作(此文件上的重置头除外)。一旦您处于thsi状态并运行:使用
commit-m“解决提交前钩子更改”--无验证。。。。。塔达!:解决了。

我明白你的意思,但这与我想做的恰恰相反。我希望black只修改文件,并使提交成功。现在在问题中得到澄清。听起来很合理。我很难理解
black
pre-commit钩子应该做什么/应该如何使用它。因为黑色的全部意义在于它修改文件,所以不会提出任何问题。我想这是该钩子作者的一个问题。你在哪里添加这个条目?black钩子和pre-commit钩子都说:
yapf
在存储库中不存在。打字错误也许它是在一个更新的版本中引入的?通常情况下,
pre-commit autoupdate
会解决这个问题。@michel.iamit
yapf
只是yapf的一个例子(从票据中复制),您需要确保您正在配置要配置的钩子(
id:black
例如)
git-commit-m“解决预提交钩子更改”-没有验证是否有此技巧,好建议!我还认为,对于像black这样的工具,它专门用于修改文件而不需要人工监督,即使它已经更改了文件,也应该提交这些文件。我在
black
存储库中打开了一个问题:
  - id: yapf
    entry: bash -c 'yapf "$@"; git add -u' --