团队协作开发中, 使用Windows系统电脑的朋友,在提交代码到Git版本库时,是否遇到过关于CRLF、LF的警告!
一、关于CR、LF和CRLF
敲下回车键,不同的操作系统保存到文件中的值不同,换行符的表示也不同。
表示
描述
保存到文件中的值
操作系统
CR
回车
\r
Mac OS
LF
换行
\n
Linux、Unix、Mac OS X
CRLF
回车换行
\r\n
Windows
问题:在团队协作开发中,开发人员若使用不同的操作系统,当使用Git协同开发同一个项目时,就会出现换行符不统一的问题。
二、Git会自动转换换行符
Git为了解决上面提出的问题,会自动对换行符进行转换。
转换方案
提交时
拉取时
说明
方案一
CRLF转换为LF
LF替换成CRLF
Windows系统推荐使用,在Windows上安装git的时候,默认是使用这个方案
方案二
CRLF转换为LF
不进行转换
Linux、Unix、Mac OS和Mac OS X推荐使用,在Unix或类Unix操作系统上安装git,默认使用这种方案
方案三
不进行转换
不进行转换
这种方案对于跨平台项目不推荐使用
若不使用方案三,那么在Git仓库(包括本地仓库和GitHub远程仓库)中保存的文件的换行符就都是LF表示的。
三、自定义换行符转换方案
在开发过程中,可以设置Git的换行符转换方案。
1、Git的全局配置(autofrlf、safecrlf)
设置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检查。
// 拒绝提交包含混合换行符的文件 (一般设置为true)
git config --global core.safecrlf true
// 允许提交包含混合换行符的文件
git config --global core.safecrlf false
// 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
上述命令运行之后,也会修改.gitconfig文件。
2、单一仓库统一配置(.gitattributes文件)
参考:https://git-scm.com/docs/gitattributes
注意:.gitattributes是针对一个单一的仓库的,也就是说每一个代码仓库都可以包含一个.gitattributes文件。这种方式设置之后,不需要一个项目组里面的同事分别再去修改自己电脑的git的全局配置。
这种方法是针对某个仓库进行换行符的统一配置,即时你已经进行了全局配置。
这个文件必须位于仓库的根目录,可以像其他文件一样修改、提交
对于通过.gitattributes设置换行符的转换方案,可以使用如下的命令:
1)text=auto:采用git认为最好的方式来处理文件,未在.gitattributes中设置的项默认按照这种方式处理。git发现是文本文件,那么在checkin的时候,会将文件结尾符转换为LF。如果文件已经被以CRLF的形式提交,不会有任何转换。(就是说已经在Git仓库中的文件,如果结束符是CRLF,不会有任何的转换)
2)-text 表示让git在checkin以及checkout的时候,对end-of-line不做任何转换。
3)text 表示在checkin的时候会被转换为LF(在repository中的文件结束符是LF),如果需要控制在checkout的时候的换行符,需要结合eol进行设置(也就是控制working tree中的文件的结尾符,需要通过eol设置)。 text=auto和text的区别在于,text=auto由git来确定是不是文本文件,从而进行转换;而text表示,你确定这个path就是文本文件,会直接对这个path进行转换,而不是由git来decides是否转换。
4)如果没有指定text,git会使用全局配置中的core.autocrlf来进行eol的转换。core.autocrlf需要自己在自己的电脑上进行配置。
5)eol=crlf:对左边匹配的文件统一使用CRLF换行符格式,如果有文件中出现LF将会转换成CRLF;也就是说,在checkin和checkout的时候,文件中都是CRLF,LF会被转换为CRLF。
6)eol=lf:对左边匹配的文件统一使用LF换行符格式,如果有文件中出现CRLF将会转换成LF;也就是说,在checkin和checkout的时候,文件中都是LF,CRLF会被转换为LF。
7)binary: 告诉git该文件为二进制,防止git修改该文件。git不会对其中的换行符进行改变。
注意:.gitattributes文件必须在提交之后才能生效。