繁体   English   中英

使用带有 git clean 过滤器的黑色

[英]Using black with git clean filter

我正在尝试设置黑色以在签入 git 的任何文件上运行。

我已将其设置如下:

git config filter.black.clean 'black -'
echo '*.py filter=black' >> .git/info/attributes

据我了解,这应该可以正常工作-因为源路径将从STDIN读取并输出到STDOUT ,这是我认为 git 过滤器需要它做的事情。

但是,这不起作用。 当我使用git add添加非黑色文件时,我看到以下输出:

reformatted -
All done! ✨ 🍰 ✨
1 file reformatted.

并且文件在磁盘上没有改变。 我究竟做错了什么?

Black 文档建议使用预提交挂钩,而不是涂抹和清洁过滤器。 请注意, filter.black.clean定义了一个干净的过滤器,并且您没有设置任何污迹过滤器。

您看到文件的工作树版本没有变化的原因是在将文件的工作树版本转换为文件的索引(待提交)版本时使用了一个干净的过滤器。 这对文件的工作树版本没有影响!

涂抹过滤器的使用方向相反:Git 有一个文件在索引中——无论出于何种原因,例如因为它只是作为git checkout操作的一部分被复制到索引中以切换到特定的提交——并且希望将该索引中的、压缩的、Git 化的文件转换为您可以在编辑器中实际查看和编辑的文件,或使用python运行的文件。 此时,Git 将通过您的涂抹过滤器运行(解压缩的)文件内容。

请注意,如果您在一个干净的过滤器中转换一些文件内容,预压缩,然后存储库中提取该文件,进入索引,然后进入您的工作树,您将能够看到什么发生在干净的过滤器中(假设您没有消除效果的抵消污迹过滤器)。

在代码重新格式化的世界中,可以想象使用干净的过滤器将所有源文件转换为某种规范(可能是四个空格缩进)形式,并使用涂抹过滤器将所有源文件转换为首选格式(两个-空格或八空格缩进)。 如果这些转换都是完全可逆的,那么您在工作树中看到的将是您喜欢的格式,而其他人在他们的工作树中看到的将是他们的首选格式; 但是版本控制系统本身会看到规范的标准化格式。

这不是黑色的实际使用方式,尽管它可能可以这样使用。

如何手动设置这一点并不明显,但使用预提交框架似乎效果很好。

这种方法做了两件事:

  1. 在提交之前检查文件是否通过了black测试
  2. 如果没有,则运行black以修复文件

因此,如果文件未通过,则提交失败,并且 black 修复了您需要git -add的文件,然后再尝试再次提交。

在单独的测试中,我设法使用black . --check black . --check in .git/hooks/pre-commit (这只是进行检查 - 如果失败则不会修复任何问题),但从未弄清楚如何配置 black 以使用 clean 和 smudge 过滤器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM