如何在跨平台编程中自动转化换行符

Git
作者

yangjh

发布日期

2022年7月7日

不同的操作系统有不同的换行符格式,跨平台协作时需要考虑版本管理工具(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和苹果平台上换行则是使用0a0d 一个字节表示。

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:优雅处理换行符的终极方法

以上提到的问题,其实可以总结为两类:

  1. Git 的换行符转换策略配置需要与项目同步,不能仅仅是依靠团队规范来约束;
  2. 文件是否需要做换行符转换处理,是由文件本身的属性决定的,需要对每个文件分别对待;

使用 .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、留意提交时的换行符警告。

参考资料

  1. Git - gitattributes Documentation (git-scm.com)
  2. Git自动换行符 - 简书 (jianshu.com)
  3. Git 进阶 | 3分钟学会优雅处理换行符 - 简书 (jianshu.com)
回到顶部