我设置了一个干净的过滤器来应用自动套用格式和 uncrustify。相应的污迹过滤器不执行任何操作,它只是调用cat.
[filter "autoformat"]
clean = uncrustify -c ~/tmp/autoformat/uncrustify.cfg --replace
smudge = cat
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我签出 eg 时master,git 说我的工作树与提交不同,而显示的差异是 clean 过滤器的作用。
看来 clean 过滤器是在 diff 之前应用的。那是对的吗?是否可以禁用此功能?这是个好主意吗?
我想要一个将自动格式应用于暂存区域的解决方案,即仅暂存的块。清洁过滤器不是一个合适的解决方案吗?
在我的 uncrustify 配置中,主提交不符合我的编码标准,checkout -f HEAD^然后checkout master -f显示了差异。这既令人困惑又麻烦(git 拒绝签出其他内容,以防止丢失更改)。
\n\n\n看来 clean 过滤器是在 diff 之前应用的。那是对的吗?
\n
是的。至少在某些情况下必须如此。例如,考虑一下,如果污迹过滤器由“每个字符加倍”组成,而干净的过滤器由“删除加倍”\xe2\x80\x94 组成,或者,如果这看起来太奇怪,如果污迹过滤器包含“翻译成一些备用字符集”,干净的过滤器会翻译回来。
\n\n要将git diff工作树与实际提交进行比较,必须对提交的内容运行污迹过滤器,或者对工作树的内容运行干净过滤器。或者它甚至可能同时运行两者,并将输出保存到临时文件中。(我很确定我很久以前测试过一次,发现 Git 使用的方法是运行 clean 过滤器,而不是 smudge 过滤器。但是请参阅Cyker 的评论,它表明它同时运行过滤器和然后比较模糊的结果。)
\n\n\n是否可以禁用此功能?这是个好主意吗?
\n
请参阅上面\xe2\x80\x94,您最多可能有一个“仅运行污迹过滤器”选项(但没有)。
\n\n请注意,根据定义,索引中的内容已经是干净的。清理发生在从工作树到索引的转换时;污点发生在从索引到工作树的转换过程中。
\n\n现有提交是严格只读的,将提交提取到索引中不会发生任何更改。因此,虽然索引内容根据定义是干净的,但如果干净过滤器本身已更改,它们可能与重新运行过滤器所获得的内容不匹配。
\n\n\n\n\n我想要一个将自动格式应用于暂存区域的解决方案,即仅暂存的块。清洁过滤器不是一个合适的解决方案吗?
\n
这并不像你想的那样。
\n\n运行git add不会将 diff 块应用于索引副本:运行会将整个git add工作树文件复制到索引中。整个东西都被清理干净了。
运行git add -p实际上也不会将差异块应用到索引副本,因为它实际上不能。相反,git add -p将索引副本提取到临时文件,将 diff hunk 应用到临时文件,然后将整个临时文件(带有应用的 hunk)复制到索引中,通过 clean 过滤器运行该文件。整个事情再次被清理\xe2\x80\x94\只是“整个事情”是通过修补弄脏的索引副本构建的临时文件。
换句话说,每个文件的索引副本本身就是一个实体,独立于HEAD提交副本和工作树副本。 Git 首先将git checkout文件的提交副本直接复制到索引中(无更改,无过滤器),然后将文件的索引副本复制到工作树中(涂抹过滤器)。有时git add,Git 在工作树文件(或修补的结果)上运行干净的过滤器,并将其填充到索引中。1
1从技术上讲,索引保存的不是文件本身,而是其内容哈希值。添加文件包括将文件写入存储库!生成的blob对象的哈希 ID会进入索引。如果索引是使用 blob 的唯一位置,则索引条目可防止 blob 被垃圾收集(如果 blob 与某些已提交的 blob 匹配,则它不会受到 Grim Collector 的影响)。
\n| 归档时间: |
|
| 查看次数: |
1695 次 |
| 最近记录: |