Git中CRLF与LF的转换

Posted wangwenhui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git中CRLF与LF的转换相关的知识,希望对你有一定的参考价值。

1.换行符在不同的操作系统上的表示

首先要理解的一点是,对于不同的操作系统,对于换行符的表示是不一样的。也就是说当我们在编辑一个文件,在键盘上按下回车键的时候,对于不同的操作系统保存到文件中的换行符是不一样的。见下表:

CR:表示回车
LF:表示换行

CRLF:表示回车换行


敲下回车键,不同的操作系统保存到文件中的值:
Windows:使用的是CRLF ==> 即
,文件中保存的是

Linux/Unix: 使用的是LF ==> 即
,文件中保存的是

Mac OS: 使用的是CR ==> 即
,文件中保存的是
Mac OS X系统:使用的是LF ==> 即
,文件中保存的是
(Mac OS X已经改成和Unix/Linx一样使用LF)

问题: 既然不同的操作系统,对于换行符使用不同的表示形式,如果一个团队在开发一个共同的项目,如果你使用的是windows系统,而你的小伙伴用的是Mac的话,当你们使用git协同开发软件时,就会出现换行符不统一的问题。

虽然对于不同的操作系统,默认的换行符的表示方法不一样,但是编辑器是可以设置在敲下回车键的时候保存的换行符是什么的,比如常用的vscode就可以进行设置。直接点击编辑器右下角的LF或者CRLF,出现如下图所示的设置,直接选择即可。在设置完成之后,在敲回车键,保存在文件中的换行符就是你设置的(CRLF或者是LF,设置什么就是什么)。

2.Git会自动对换行符进行转换

Git为了解决上面提出的问题,会自动对换行符进行转换。转换的方案有3种:

  1. 在提交时将CRLF转换为LF,在拉取(检出checkout)时将UNIX换行符(LF)替换成CRLF。(Windows系统推荐使用,我们在windows上安装git的时候,如果一路next,默认是使用这个方案)
  2. 在提交时将CRLF转换为LF,在拉取(检出checkout)时不进行转换。(Linux/Unix和Mac OS和Mac OS X推荐使用,在Unix或者类Unix操作系统上安装git,默认使用这种方案)
  3. 不进行转换(这种方案对于跨平台项目不推荐使用)。

可以发现,如果不使用第3种方案,那么在Git仓库(包括本地仓库和GitHub远程仓库)中保存的文件的换行符都是LF表示的。

3.自己指定换行符转换方案

我们自己在开发过程中,是可以修改/设置Git的换行符转换方案的。修改/设置的方法有2种。

3.1 通过Git的全局配置进行修改

设置autoclf属性,在控制台直接运行如下的一条命令就可以设置了:

// 提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true   

// 提交时转换为LF,检出时不转换
git config --global core.autocrlf input   

// 提交检出均不转换
git config --global core.autocrlf false

上述命令运行之后,会修改.gitconfig文件。

一般在项目中,为了避免项目中同时出现CRLF和LF,还可以开启safecrlf检查。当然,如果你的项目自己定义了语法检查规则,例如使用eslint去约束换行符必须是LF,那么当你的文件中出现CRLF的时候,eslint会给你错误提示信息,告诉你不能包含CRLF,这时候,不开启safecrlf也是可以的 (一般建议开启)

开启方法如下第一条命令:

// 拒绝提交包含混合换行符的文件 (一般设置为true)
git config --global core.safecrlf true   

// 允许提交包含混合换行符的文件
git config --global core.safecrlf false   

// 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn

上述命令运行之后,也会修改.gitconfig文件。

3.2 通过.gitattributes进行修改

注意.gitattributes是针对一个单一的仓库的,也就是说每一个代码仓库都可以包含一个.gitattributes文件。这种方式设置之后,不需要一个项目组里面的同事分别再去修改自己电脑的git的全局配置。

对于通过.gitattributes设置换行符的转换方案,可以使用如下的命令:

1. text=auto:采用git认为最好的方式来处理文件,未在.gitattributes中设置的项默认按照这种方式处理;

2. text eol=crlf:对左边匹配的文件统一使用CRLF换行符格式,如果有文件中出现LF将会转换成CRLF;

3. text eol=lf:对左边匹配的文件统一使用LF换行符格式,如果有文件中出现CRLF将会转换成LF;

4. binary: 告诉git该文件为二进制,防止git修改该文件。git不会对对其中的换行符进行改变。

注意:.gitattributes文件必须要提交之后才能生效。

参考博客:

  1. https://segmentfault.com/a/1190000013973362?utm_medium=referral&utm_source=tuicool
  2. https://www.jianshu.com/p/f13ef9e538e0

以上是关于Git中CRLF与LF的转换的主要内容,如果未能解决你的问题,请参考以下文章

git转换换行符LF与CRLF转换问题-Windows系统和Linux系统差异统一

Git将图像中的CRLF转换为LF

git 跨平台换行符处理

eslint 关于CRLF或者LF报错

phpstorm设置换行兼容Windows(CRLF)和Linux(LF)

windows使用git时出现:warning: LF will be replaced by CRLF