Git clean filter引发diff显示差异:能否禁用diff前的clean过滤?
Git Clean Filter 在 Diff 时的行为与禁用方法
你的观察完全正确——Git 默认会在执行 diff(包括检查工作区与提交版本的差异时)对工作区文件应用 clean filter,再把处理后的内容和仓库里存储的版本对比。这么设计是因为 Git 更关注「你将要提交的内容」(也就是经过 clean 处理后的格式化版本)和仓库现有内容的差异,而不是工作区里的原始未格式化文件。
要禁用这个行为很简单,只需要在你的 filter 配置里加上一行 diff = false 即可:
打开你的 Git 配置文件(全局的 ~/.gitconfig 或者仓库本地的 .git/config),找到 [filter "autoformat"] 部分,修改成这样:
[filter "autoformat"] clean = uncrustify -c ~/tmp/autoformat/uncrustify.cfg --replace smudge = cat diff = false
添加这行配置后,Git 在做 diff 对比时就不会再对匹配这个 filter 的文件应用 clean 处理了,会直接拿工作区的原始文件和仓库版本对比。
另外提个小细节:你的 clean 命令用了 --replace 参数,这个参数会直接修改工作区的原文件。正常来说,执行 git add 时 uncrustify 会自动格式化工作区文件,这时候工作区和仓库里的内容应该是一致的,切换分支不该出现差异。如果还是有问题,可能是工作区存在未提交的修改,或者仓库里旧提交的文件没经过 clean 处理(比如你是后来才配的这个 filter)。这种情况可以把仓库里已有的文件重新跑一遍 clean 再提交,确保所有历史版本都是格式化后的,后续切换分支就不会有奇怪的差异了。
内容的提问来源于stack exchange,提问作者Gauthier
相关产品推荐
相关产品推荐

