Git为何在含空格文件名的diff的+++ b/行添加尾随制表符?
Git Diff输出中含空格文件名后添加制表符的原因与解决办法
你发现Git在git-diff(包括git show这类输出diff的命令)中,会给包含空格的文件名末尾添加一个制表符,测试示例如下:
$ git init test $ cd test $ echo 'test' > 'file with spaces' $ git add . $ git commit -m 'Add' $ git show | grep '<literal-TAB-here>' | od -c 0000000 + + + b / f i l e w i t h 0000020 s p a c e s 0000030
原因解析
Git的这个行为是为了兼容早期的补丁解析工具和邮件客户端。在过去,很多处理补丁文件的程序依赖文件名后的制表符来划分“文件名区域”和“补丁内容区域”。如果带空格的文件名后没有这个制表符,老旧工具可能会误把文件名里的空格当作分隔符,将文件名的后半段识别成补丁内容的一部分,导致解析失败。所以Git特意给这类文件名追加制表符,确保补丁能被传统工具正确识别。
禁用该行为的方法
你提到的-z选项(用于空字符分隔输出)和core.quotepath=false(用于取消路径的引号转义)都不影响这个制表符的生成逻辑,它们的作用场景和这个问题无关。
要阻止Git添加这个制表符,Git 2.11及以上版本提供了直接的解决方案:
- 单次命令生效:在
git diff或git show后添加--no-tab-in-filename参数git show --no-tab-in-filename - 全局永久生效:修改Git配置,将
diff.tabInFilename设置为false
如果只想针对当前仓库生效,去掉git config --global diff.tabInFilename false--global参数即可。
内容的提问来源于stack exchange,提问作者VZ.
相关产品推荐
相关产品推荐

