1

我想在提交时运行黑色以格式化所有暂存的 .py 文件。不幸的是,由于雇主网络 VPN 和限制,我无法使用pre-commit包,因为它在尝试加载 repo 时超时。

所以我决定编写自己的预提交钩子。目前我有这个

#!/bin/sh 

# Check if this is the initial commit 
if git rev-parse --verify HEAD >/dev/null 2>&1 
then 
    echo "pre-commit: About to create a new commit..." 
    against=HEAD 
else
    echo "pre-commit: About to create the first commit..."
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 
fi 

# Autoformat with black
echo "pre-commit: Autoformatting Python code with black"
black $(git diff-index --cached --name-only --diff-filter=d $against)

我从 Atlassian 找到的第一部分。第二部分需要某种过滤器,以仅从 diff-index 返回的列中获取 .py 文件。如何仅从列表中获取 .py 文件?

另外:我对 git hooks 很陌生。这是我和我的同事确保所有代码都用黑色格式化的可靠方法吗?

4

2 回答 2

3

如果您正在寻找一种方法来做到这一点bash,那么难题的缺失部分就是过滤git diff-index

在您的情况下,您可以比较HEAD将其限制为正在提交的文件名:

$ git diff --staged --name-only --diff-filter=d -- '*.py'
t.py

由于文件中可能包含空格,因此在原始帖子中编写的表达式也有些问题-通常对此的解决方法是-z与输出一起使用并xargs -0运行该工具(这将导致文件名被'\0'分隔):

git diff --staged --name-only --diff-filter=d -z -- '*.py' |
    xargs -0 black

请注意,这可能会丢失一些预提交框架会找到的文件——例如带有 python shebang 的无扩展名可执行文件,或其他通常是 python 的文件,例如.pdbrc

于 2020-11-21T01:10:40.597 回答
1

对于它的价值,通过预先提交,您可以使用local+system逃生舱口来避免下载工具(如果您已经安装了它们)

例如:

repos:
-   repo: local
    hooks:
    -   id: black-system
        name: black (system)
        entry: black
        types: [python]
        language: system
        require_serial: true

也就是说,这在很大程度上违背了框架的主要目的,因为它不再管理工具的安装(因此您必须自己手动设置它们)

值得注意的是,如果您没有安装黑色,您会看到如下内容:

$ pre-commit  run --all-files
black (system)...........................................................Failed
- hook id: black-system
- exit code: 1

Executable `black` not found

免责声明,我是pre-commit的维护者

于 2020-11-21T00:58:14.403 回答