【问题标题】:black as pre-commit hook always fails my commits黑色作为预提交钩子总是使我的提交失败
【发布时间】:2019-10-15 16:24:34
【问题描述】:

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

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

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

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

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

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

我做错了什么?

【问题讨论】:

  • 我还认为,对于像 black 这样的工具,它专门用于在不需要人工监督的情况下修改文件,即使它已经更改了文件,也应该提交文件。我在black 存储库上打开了一个问题:github.com/psf/black/issues/1857

标签: git githooks pre-commit pre-commit.com python-black


【解决方案1】:

pre-commit 的作者在这里)

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

来自这些问题之一的评论:

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

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

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

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

另一条评论说明

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

【讨论】:

  • 听起来很合理。我很难理解black pre-commit 钩子应该做什么/应该如何使用它。因为黑色的全部意义在于它修改了文件,所以没有提出任何问题。我想这是该钩子作者的问题。
  • 你在哪里添加这个条目? black 和 pre-commit-hook 都说:yapf 在存储库中不存在 。错字?也许它是在较新的版本中引入的?通常pre-commit autoupdate 会解决这个问题。
  • @michel.iamit yapf 只是 yapf 的一个示例(从票证中复制),您要确保正在配置要配置的钩子(例如 id: black
  • 我不明白这个答案是如何被接受的——我和@Jean-FrançoisCorbett 一样感到困惑。如果在暂存中不修改文件,那么格式化代码的预提交钩子有什么用?
【解决方案2】:

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

【讨论】:

  • git commit -m 'Resolving pre-commit-hook changes' --no-verify 成功了,很棒的建议!
【解决方案3】:

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

【讨论】:

  • 我明白你的意思,但这与我想要做的相反。我希望黑色只修改文件,并让提交成功。现在在问题中得到澄清。
【解决方案4】:

我和你是同一条船。 根据我的研究,提交不能通过 pre-commit 钩子修改。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 2015-07-08
    • 2012-12-22
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多