团队协作开发中, 使用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文件必须在提交之后才能生效。

Logo

更多推荐