如何处理数千个仅存在CRLF/LF换行符差异的文件?
批量处理手动传输文件的Git换行符差异问题
问题概述
我通过手动传输(非Git方式,无合并请求)从合作者手里收了一批文件,要放进Git工作区时碰到俩麻烦:
- 换行符不匹配:我的工作目录默认用CRLF,本地和远程仓库统一用LF,这批文件不符合这个规范
- 文件数量大:几千个文件里,绝大多数只有换行符不一样,真正有实质内容改动的不到一百个
已试过的操作
- Git配置调整:
设置了git config --set core.autocrlf=true,配合git rm --cached -r .和git reset --hard完成换行符归一化;在.gitattributes里给Unity模板和C#文件添加eol=crlf规则;还设置whitespace = cr-at-eol让git diff忽略换行符差异 - GUI客户端测试:
SourceTree、SmartGit都没法过滤掉仅换行符差异的文件;GitAhead能折叠这类文件,但运行起来特别卡
现有备选方案(有些不想用)
- 手动逐个审核所有文件(绝对不想干)
- 找个能过滤仅换行符差异文件的Git GUI客户端
- 用Notepad++批量把LF换成CRLF
- 建个新分支把所有文件加进去,合并到开发分支时强制仓库用LF
更高效的解决方案
方案1:用Git命令精准挑出有实质改动的文件
这是最省心的方法,完全利用Git本身的能力:
- 先把接收的文件放到工作目录对应的位置
- 执行命令:
这个命令会只输出真的有内容改动的文件(git diff --name-only --diff-filter=M -w-w忽略所有空白差异,包括换行符;--diff-filter=M只筛选修改过的文件) - 针对这些文件单独提交,剩下的仅换行符差异的文件,执行
git add .时,Git会根据你已经配置好的core.autocrlf和.gitattributes自动把换行符转成仓库要求的LF,不用手动折腾
方案2:批量修正换行符后再提交
如果不想靠Git自动转换,用命令行工具批量转格式:
- Windows上可以装
unix2dos(通过Chocolatey安装:choco install unix2dos),然后递归转换目标文件类型:# 把所有C#文件转成CRLF unix2dos **/*.cs - 转换完再看
git status,就只会显示有实质改动的文件,直接提交就行
方案3:用Git命令忽略空白差异来提交
如果暂时找不到合适的GUI工具,用命令行也能快速处理:
- 先提交有实质改动的文件:
git add -u -w-w参数让Git在添加修改时忽略空白差异,只会把真有内容变化的文件加进去 - 剩下的文件直接
git add .,Git会自动处理换行符归一化,提交后仓库里还是LF格式
后续避坑提醒
- 把
.gitattributes的规则补全,覆盖所有需要指定换行符的文件类型,避免以后再出现类似问题 - 下次一定要让合作者用Git分支或者合并请求传文件,从源头避免手动传输的格式混乱
内容的提问来源于stack exchange,提问作者BobbyVolley
相关产品推荐
相关产品推荐

