Git中CRLF与LF的转换

1.换行符在不一样的操做系统上的表示

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

CR:表示回车\r
LF:表示换行\n
CRLF:表示回车换行\r\n

敲下回车键,不一样的操做系统保存到文件中的值:
Windows:使用的是CRLF ==> 即\r\n,文件中保存的是\r\n
Linux/Unix: 使用的是LF ==> 即\n,文件中保存的是\n
Mac OS: 使用的是CR ==> 即\r,文件中保存的是\r
Mac OS X系统:使用的是LF ==> 即\n,文件中保存的是\n(Mac OS X已经改为和Unix/Linx同样使用LF)

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

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

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

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

  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表示的。bash

3.本身指定换行符转换方案

咱们本身在开发过程当中,是能够修改/设置Git的换行符转换方案的。修改/设置的方法有2种。编辑器

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

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

// 提交时转换为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也是能够的 (通常建议开启)eslint

开启方法以下第一条命令:code

// 拒绝提交包含混合换行符的文件 (通常设置为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
相关文章
相关标签/搜索