Git中CRLF与LF的转换
1.换⾏符在不同的操作系统上的表⽰
⾸先要理解的⼀点是,对于不同的操作系统,对于换⾏符的表⽰是不⼀样的。也就是说当我们在编辑⼀个⽂件,在键盘上按下回车键的时候,对于不同的操作系统保存到⽂件中的换⾏符是不⼀样的。见下表:
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协同开发软件时,就会出现换⾏符不统⼀的问题。
虽然对于不同的操作系统,默认的换⾏符的表⽰⽅法不⼀样,但是编辑器是可以设置在敲下回车键的时候保存的换⾏符是什么的,⽐如常⽤的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设置换⾏符的转换⽅案,可以使⽤如下的命令:
1. text=auto:采⽤git认为最好的⽅式来处理⽂件,未在.gitattributes中
设置的项默认按照这种⽅式处理;(If Git decides that the content
is text, its line endings are converted to LF on checkin.
When the file has been committed with CRLF, no conversion
is done.)git发现是⽂本⽂件,那么在checkin的时候,会将⽂件结尾符转
换为LF。果⽂件已经被已CRLF的形式提交(就是说已经在Gti仓库中的⽂件,如
果结束符是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。
7. eol=lf:对左边匹配的⽂件统⼀使⽤LF换⾏符格式,如果有⽂件中出现CRLF将会转换成LF;也就是说,在checkin和checkout的时候,⽂件中都是LF,CRLF会被转换为LF。
8. binary: 告诉git该⽂件为⼆进制,防⽌git修改该⽂件。git不会对对其中的换⾏符进⾏改变。git常用指令
注意:.gitattributes⽂件必须要提交之后才能⽣效。
参考博客:
1.
2.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。