如何在工作树文件上应用git清洁过滤器



我想让git在工作树文件上运行所有配置的过滤器并打印结果输出(即将写入索引的相同内容)。有git命令可以这样做吗?例如,我正在寻找:

$ git the-command-i-am-looking-for < huge-lfs-file
version https://git-lfs.github.com/spec/v1
oid sha256:60ab6bad73e833318d3ad4a186c7ea77e0cf26c1419474dd6786db1c53a366c6
size 1050624

没有git命令。

要手动执行此操作,您必须确定要将哪个过滤器应用于文件,然后运行该过滤器。如果过滤器是旧样式驱动程序,则运行它非常容易。如果是新型驱动程序,那么运行它会更加困难。发现它可能有些棘手,但实际上很容易。

在gitattributes手动页面中记录了所有内容。要应用的过滤器是由"最佳匹配" filter=name指定的过滤器。"最佳匹配"是最后一个进行的,并按顺序进行匹配,从顶级 .gitattributes文件开始,然后将工作树向最近的 .gitattributes文件沿着文件中的任何子目录中的任何子目录中播放到最近。例如,如果项目本身具有:

.gitattributes
dir/.gitattributes
dir/sub/.gitattributes
dir/sub/subsub/.gitattributes

,文件本身命名为 dir/sub/name.ext,我们在 .gitattributes中查找与 name.ext匹配的任何模式并采用其定义:

$ cat .gitattributes
* driver=d1
*.ext driver=d2
name.* driver=d3

由于name.ext匹配*,因此适用第一行。由于name.ext匹配*.ext,因此第二行也适用。由于name.ext匹配name.*,因此也适用第三行,因此到目前为止的最佳匹配是d3

然后我们查看dir/.gitattributes

$ cat dir/.gitattributes
*.ext driver=d4
*.dat driver=d5

*.ext也匹配,因此到目前为止最好的匹配是d4

现在我们查看dir/sub/.gitattributes

$ cat dir/sub/.gitattributes
* driver=d6

*匹配,所以到目前为止最好的匹配是d6

有一个dir/sub/subsub/.gitattributes,但是我们不在那里看,因为该文件在dir/sub中,而不是dir/sub/subsub。因此,适用于dir/sub/name.ext的驱动程序是d6

现在,我们只需要找到d6的实际驱动程序,我们通过运行git config --get来做到这一点:

git config --get filter.d6.clean

无论如何,我们应该将其应用于dir/sub/name.ext的干净过滤器。(假设是run-d6 %f或仅是run-d6。)但是,我们必须检查是否有filter.d6.process设置:

git config --get filter.d6.process

如果这样的设置(git config通过以非零状态退出来指示),我们有一个旧样式的驱动程序过滤器,它易于运行:它只是读取其标准输入,并写信它的标准输出,也许将文件的路径名作为参数。如果调用行是run-d6 %f,我们刚刚运行:

git clean dir/sub/name.ext < dir/sub/name.ext > /tmp/cleaned

例如。

如果那里 a filter.d6.process,请调用它清洁dir/sub/name.ext非常棘手。有关详细信息,请参见文档。不幸的是,现代的git-lfs使用了长期运行的过滤过程(实际上,我相信git-lfs是 这些都存在),但我怀疑有一些向后兼容的方法可以在长期运行的过滤过程仍然相对较新的时间。

(请注意,在实践中,人们不会构建复杂的.gitattributes树结构。对于git-lfs,特别是在最高级别上只有一个.gitattributes,可以通过长期运行的过程运行 everything 。)

最新更新