我想在提交时运行黑色以格式化所有的分阶段.py文件。不幸的是,由于雇主网络虚拟专用网和限制,我无法使用预承诺包,因为它超时时,试图加载回购。
所以我决定写我自己的预提交钩子。目前我有这个
#!/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)我在亚特兰西安发现的第一部分。第二部分需要某种类型的过滤器才能从由diff返回的列中获取.py文件。如何从列表中只获取.py文件?
还有:我对git钩子很陌生。对于我和我的同事来说,这是一种确保所有代码都用黑色格式化的健壮方法吗?
发布于 2020-11-21 01:10:40
如果您正在寻找一种在bash中实现此操作的方法,那么拼图中缺少的部分就是git diff-index的筛选器。
在您的示例中,您可以对HEAD进行区分,这将将其限制为提交的文件名:
$ git diff --staged --name-only --diff-filter=d -- '*.py'
t.py在原始文章中编写的表达式也有一点问题,因为文件中可能包含空格--通常的修复方法是在输出和xargs -0中使用xargs -0来运行该工具(这将导致文件名被'\0'分隔):
git diff --staged --name-only --diff-filter=d -z -- '*.py' |
xargs -0 black请注意,这可能会遗漏一些预提交框架会找到的文件--例如,使用python的无扩展可执行文件,或者其他传统上属于python的文件,如.pdbrc。
发布于 2020-11-21 00:58:14
至于它的价值,使用预承诺,您可以使用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免责声明,我是预承诺的维护者
https://stackoverflow.com/questions/64935598
复制相似问题