如何在跨平台编程中自动转化换行符
不同的操作系统有不同的换行符格式,跨平台协作时需要考虑版本管理工具(git)对换行符的处理。
回车和换行
回车(Carriage Return)和换行(Line Feed)概念:
- 回车CR:将光标移动到当前行开头;
- 换行LF:将光标“垂直”移动到下一行,并不改变光标水平位置。
不同系统下的换行符
CR、LF、CR/LF为不同操作系统上使用的换行符:
- Windows/DOS系统:采用CR/LF表示下一行;
- Unix/Linux/Mac OS系统:采用LF表示下一行;
CR使用符号'\r'
,ASCII代码是13,十六进制代码为0x0D
;
LF使用'\n'
符号表示,ASCII代码是10,十六制为0x0A
。
所以Windows平台上换行在文本文件中是使用0d 0a
两个字节表示,而UNIX和苹果平台上换行则是使用0a
或 0d
一个字节表示。
Unix/Linux/Mac系统下的文件在Windows里打开的话(使用Windows自带记事本),会出现换行丢失,所有文字会变成一行,整个文本会乱成一团。Windows系统下的文件在Unix/Linux/Mac里打开的话,在每行的结尾可能会多出一个^M符号。
目前大部分的编辑器和IDE都支持这几种换行符(除了notepad),但是跨平台协作项目源码到底保存为哪种风格的换行符呢?输出的文本需要保存为哪种风格的换行符呢?Git提供了一个解决方案——在跨平台协作场景时,会提供一个“换行符自动转换”的功能。
Git CRLF
Git默认在提交时将Windows换行符(CRLF)转换为LF,在拉取时将UNIX换行符(LF)替换成CRLF。我们可以通过设置autocrlf和safecrlf来设置具体的操作。
autocrlf
// 提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true
// 提交时转换为LF,检出时不转换
git config --global core.autocrlf input
// 提交检出均不转换
git config --global core.autocrlf false
safecrlf
// 拒绝提交包含混合换行符的文件
git config --global core.safecrlf true
// 允许提交包含混合换行符的文件
git config --global core.safecrlf false
// 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
.gitattributes:优雅处理换行符的终极方法
以上提到的问题,其实可以总结为两类:
- Git 的换行符转换策略配置需要与项目同步,不能仅仅是依靠团队规范来约束;
- 文件是否需要做换行符转换处理,是由文件本身的属性决定的,需要对每个文件分别对待;
使用 .gitattributes
就完美解决了以上两个问题:
.gitattributes
具有最高的优先级,无论你是否设置相关的换行符风格转化属性,你都可以和团队保持一致;- 使用
* text=auto
可以定义开启全局的换行符转换; - 使用
*.bat text eol=crlf
就可以保证 Windows 的批处理文件在checkout
至工作区时,始终被转换为CRLF
风格的换行符; - 使用
*.sh text eol=lf
就可以保证 Bash 脚本无论在哪个平台上,只要被checkout
至工作区,始终被保持LF
风格的换行符; - 使用
*.jpg -text
可以禁止 Git 将 jpg 文件识别为文本文件,从而避免由于换行符转换引入的数据损坏;
关于 .gitattributes
的详细使用方法,可以参考Git Documentation:gitattributes。
如果你觉得太麻烦,可以直接到这里。链接中的网站,提供了一系列针对各种开发环境,已经写好了的 .gitattributes
文件。
项目实施
设置原则
保证仓库永远换行符永远采用UNIX标准(LF),在Windows工作空间设置为Windows标准(CRLF),在Mac/Linux工作空间设置为Unxi标准(LF),适合跨平台编程。
团队设置
统一不同平台下的换行符标准,按照上面设置原则的标准,配置自己的代码编辑器和IDE,达到两项要求:
- 在新建文件时默认使用团队统一的换行符标准;
- 在打开文件时保持现有换行符格式不变(不要做自动转换)。
Git设置
1、设置换行符自动转换功能
Mac
git config --global core.autocrlf input
Windows
git config --global core.autocrlf true
2、设置换行符检查功能
// 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
添加仓库配置文件
参考alexkaratarakis/gitattributes: A collection of useful .gitattributes templates (github.com)中设置,为仓库添加.gitattributes
文件。
留意每次提交
1、留意每次提交的更改行数。
2、留意提交时的换行符警告。