关于操作系统尾部换行符
之前从 Windows 更换到 Mac,pull 代码下来修改完提交时,发现一个提示
说我正在提交一个 CRLF 文件到仓库上,问我要怎么处理。而在使用 git add .
指令时,也会弹出如下一些警告:
1 |
|
这个 CRLF 其实是不同操作系统的尾部换行符的格式,CR(Carriage Return),LF(LineFeed),CRLF(Carriage Return Line Feed),中文意思就是回车换行
- 回车符就是回到一行的开头,用符号 r 表示,十进制 ASCII 代码是 13,十六进制代码为0x0D,回车(return);
- 换行符就是另起一行,用 n 符号表示,ASCII 代码是 10,十六制为 0x0A, 换行(newline)
所以我们平时编写文件的回车符应该确切来说叫做回车换行符,它们的应用情况如下
- Dos 和 Windows 平台: 使用回车(CR)和换行(LF)两个字符来结束一行,回车 + 换行(CR+LF),即“\r\n”;
- Mac 和 Linux平台:只使用换行(LF)一个字符来结束一行,即“\n”;
- 最早Mac每行结尾是回车CR 即’\r’,后mac os x 也投奔了 unix
许多 Windows 上的编辑器会悄悄把行尾的换行(LF)字符转换成回车(CR)和换行(LF),或在用户按下 Enter 键时,插入回车(CR)和换行(LF)两个字符
假如你正在 Windows 上写程序,又或者你正在和其他人合作,他们在 Windows 上编程,而你却在其他系统上,在这些情况下,就可能会遇到行尾结束符问题,这是因为 Windows 使用回车和换行两个字符来结束一行,而 Mac 和 Linux 只使用换行符一个字符。虽然这是小问题,但它会极大地扰乱跨平台协作,在提交时产生非常多的冲突
对于不同的平台,有不同的处理方案:
Git可以在你提交时自动地把行结束符 CRLF 转换成 LF,而在检出代码时把 LF 转换成 CRLF。设置 core.autocrlf 来打开此项功能,如果是在 Windows 系统上,就把它设置成 true,这样当检出代码时,LF 会被转换成CRLF:
1
$ git config --global core.autocrlf true
Linux 或 Mac 系统使用LF作为行结束符,因此你不想 Git 在检出文件时进行自动的转换;当一个以 CRLF 为行结束符的文件不小心被引入时你肯定想进行修正,把 core.autocrlf 设置成 input 来告诉 Git 在提交时把 CRLF 转换成 LF,检出时不转换:
1
$ git config --global core.autocrlf input
这样会在 Windows 系统上的检出文件中保留 CRLF,会在 Mac 和 Linux 系统上,包括仓库中保留 LF。
如果你是 Windows 程序员,且正在开发仅运行在 Windows 上的项目,可以设置 false 取消此功能,把回车符记录在库中:
1
$ git config --global core.autocrlf false
上面三条总结起来就是下面的情形,x 是你当前使用的系统所使用的换行方式
1
2
31) true: x -> LF -> CRLF # 提交时转换为 LF,检出时转换为 CRLF
2) input: x -> LF -> LF # 提交时转换为 LF,检出时不转换
3) false: x -> x -> x # 提交检出均不转换
项目已经存在换行符不同的问题的解决方案
- 如果当前开发有多个分支且各分支不同步,需要每个分支进行一次转换
- 如果只有一个分支或多个分支处于同一节点。可以从 master 切换一个新分支,进行转换,然后 commit ,将此分支合并到所有分支。
- 将修改过的分支 push 到 gitlab,让其他成员更新代码即可。
- Ps:由于每个人系统不同或者就是 git 的问题,可能出现更新完代码换行符不变,这时以服务器上的代码为准重新 clone 一份最新代码即可
一些要注意的点
- git 的 Windows 客户端基本都会默认设置 core.autocrlf=true,设置 core.autocrlf=true, 只要保持工作区都是纯 CRLF 文件,编辑器用 CRLF 换行,就不会出现警告了,这里出现警告,就是因为文件用了 LF 换行
- Linux 最好不要设置 core.autocrlf,因为这个配置算是为 Windows 平台定制
- Windows 上设置 core.autocrlf=false,仓库里也没有配置 .gitattributes,很容易引入 CRLF 或者混合换行符(Mixed Line Endings,一个文件里既有 LF 又有CRLF)到版本库,这样就可能产生各种奇怪的问题