25

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

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

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

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

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

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

我究竟做错了什么?

4

4 回答 4

25

pre-commit这里的作者)

该框架有意不提供自动提交修改的方法。以下是一些要求此类问题的问题:

其中一个问题的评论:

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

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

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

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

另一条评论说明

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

于 2019-10-19T00:18:25.313 回答
7

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

于 2020-03-25T23:27:07.650 回答
4

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

于 2019-10-16T02:59:48.267 回答
0

我和你是同一条船。根据我一直在研究的内容,提交不能通过预提交挂钩进行修改。

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

这说得通。提交中的任何更改都必须暂存。如果我们可以从 git 钩子中做到这一点,那么我们的问题就解决了。通过直接从 git 挂钩修改文件,您已经成功了一半。下半部分将暂存已修改文件的所有更改。但显然......“你不能在预提交钩子中修改提交”,这意味着没有分期。https://stackoverflow.com/a/14641656/6032076

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

从头开始,这个答案(https://stackoverflow.com/a/16832764/6032076)声称可以在预提交挂钩中更改提交。在那种情况下,文件正在被添加,所以我敢打赌,我们的案例文件可以重新编排/修改。

于 2019-10-18T03:46:23.787 回答