Linux适配Windows Git仓库:实现检出LF提交CRLF的方法
针对上游CRLF仓库的Linux本地行尾处理方案
方案一:自定义Clean/Smudge过滤器(推荐)
这个方案可以强制实现本地检出LF、提交时转CRLF的逻辑,同时解决仓库混合行尾的问题:
- 定义Git过滤器
在本地仓库执行以下命令,创建名为win2unix的过滤器:
git config --local filter.win2unix.smudge 'sed "s/\r$//"' git config --local filter.win2unix.clean 'sed "s/$/\r/"'
smudge钩子:检出文件时,移除所有行尾的\r,确保本地文件统一为LF格式clean钩子:提交文件时,给每行末尾添加\r,确保推送到上游的文件是CRLF格式
- 配置.gitattributes应用过滤器
在仓库根目录创建或编辑.gitattributes文件,添加规则:
* filter=win2unix # 排除二进制文件,避免过滤器破坏内容 *.png binary *.jpg binary *.exe binary *.zip binary # 根据实际情况添加更多二进制类型
这条规则会让所有文本文件应用上述过滤器,二进制文件则跳过处理。
- 重置本地文件以生效
先备份未提交的修改(如果有的话),然后执行以下命令让Git重新检出所有文件并应用过滤器:
git rm --cached -r . git reset --hard
方案二:结合core.eol与局部文本属性
如果不想用过滤器,也可以通过Git内置属性实现近似效果:
- 设置全局core.eol为LF
git config --global core.eol lf
确保本地默认检出LF格式。
- 仓库级配置强制提交CRLF
在仓库的.gitattributes中添加:
* text eol=crlf
这条规则会让Git在提交时自动将LF转换为CRLF,检出时保持LF格式(受core.eol影响)。不过这个方案对混合行尾的兼容性略差,若仓库中存在大量混合行尾文件,优先选方案一。
注意事项
- 无论用哪种方案,都要确保二进制文件被正确标记为
binary,避免行尾转换破坏文件内容 - 如果之前用过dos2unix过滤器,需要先清理旧配置:
git config --local --unset filter.dos2unix.smudge和git config --local --unset filter.dos2unix.clean
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

