Windows 操作系统使用的 CRLF。
Unix 的操作系统使用的 LF。
Mac OS 起初使用的 CR,后来到了 Mac OS X 后,改成了使用 LF,与 Unix 系统保持一致。
问题
Windows 上 Git 在获取代码时,默认会自动把换行符由 LF 转为 CRLF,在提交时又把 CRLF 转为 LF。
在一些情况下这样会出现问题。
解决
1.在项目中添加 .gitattributes 文件,与 .gitignore 方式类似
https://git-scm.com/docs/gitattributes
https://github.com/alexkaratarakis/gitattributes
- 使用 * text=auto 可以定义开启全局的换行符转换
- 使用 *.bat text eol=crlf 就可以保证 Windows 的批处理文件在 checkout 至工作区时,始终被转换为 CRLF 风格的换行符
- 使用 *.sh text eol=lf 就可以保证 Bash 脚本无论在哪个平台上,只要被 checkout 至工作区,始终被保持 LF 风格的换行符
- 使用 *.jpg -text 可以禁止 Git 将 jpg 文件识别为文本文件,从而避免由于换行符转换引入的数据损坏
2.设置 Git(实际就是修改的用户目录下的 .gitconfig 文件)
# 提交时转换为 LF,检出时转换为 CRLF git config --global core.autocrlf true # 提交时转换为 LF,检出时不转换 git config --global core.autocrlf input # 提交检出均不转换 git config --global core.autocrlf false # 拒绝提交包含混合换行符的文件 git config --global core.safecrlf true # 允许提交包含混合换行符的文件 git config --global core.safecrlf false # 提交包含混合换行符的文件时给出警告 git config --global core.safecrlf warn # 设置行结束符的类型为 lf git config --global core.eol lf # 设置行结束符的类型为 crlf git config --global core.eol crlf # 设置行结束符的类型为 native, native 是指平台默认的行结束符。默认的类型是 native git config --global core.eol native git config --global core.filemode false
开发仅在 Windows 上运行的项目,可以将 core.autocrlf 设置 false。
换行符转换
sudo apt-get install dos2unix # 当前目录及其子目录下所有文件换行符转由 CRLF 为 LF find ./ -type f -exec dos2unix {} +