GIT中关于换行符CRLF和LF的探究

 

平时在使用hexo写博客,提交发布的时候,总会在命令行报warning,大量的CRLFLFCR等字眼,而在使用WebStorm开发项目时,右下角除了编码模式,分支切换,行号等提示外,总会不经意间扫到CRLF的配置,点开看看还有LF - Unix and OS X(n)CR - CLassic Mac(r)这样的配置项。本来以为是键盘按键的设置(win 和 mac有几个键不一样),今天随手一搜,发现原来是另外一回事儿,花半小时简单总结一下,写篇小博客。

背景

CR(Carriage Return)代表的是回车,使用r来表示;LF(Line Feed)代表换行,使用n来表示,由于历史的原因,各操作系统的文本换行符号是不一致的,windows系统使用CRLF,即rn来表示换行,Uninx和近些年的OS X使用LF,即n来表示换行,更早的Mac系统则使用CR,即r来表示换行,不过这系统现在已经很少人用了。

现在问题来了,多人协作开发时,不可能保证每个人使用的系统一致,这就会导致换行编码的不同,虽然说“换行”在人眼看来没有区别,但是git面前可就不一样了,在推拉代码的过程中,如果换行符不一样,我是给你显示文件有修改呢还是直接默认没有任何更改?

好在git提供了一个“换行符自动转换”功能帮我们处理了这个问题。默认情况下,git在远程仓库保存代码使用Unix风格,即换行符统一使用LF模式(n),在推-拉代码的过程中,则有以下的规则:

  • 提交代码时,git会将文本文件中的换行符转换为LF模式,这个过程也叫标准化过程
  • 拉取代码时,git会将试图将仓库中的代码转换为CRLF模式,这个过程也叫转换

通过这样的拉-推自动转换,git不仅保持了远程仓库代码的一致性(Unix风格),而且保证了本地文件的兼容性(Windows系统)。

GIT个性化配置

既然有默认配置,那就有个性化的选择,git提供了core.autocrlfcore.safecrlf两个配置项来供开发者自由配置。两者都支持全局本地设置。

git config --global core.autocrlf [true | input | false]   #全局设置
git config --local core.autocrlf [true | input | false]    #针对本项目设置

git config --global core.safecrlf [true | warn | false]    #全局设置
git config --local core.safecrlf [true | warn | false]     #针对本项目设置

core.autocrlf

core.autocrlf有三个值,默认是 true。这个配置用来决定要不要转换,怎么转换。

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

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

// 提交检出均不转换
git config --global core.autocrlf false
  • 第一行:当你将文件添加到暂存区时,Git可以通过设置core.autocrlf将CRLF行结尾自动转换为LF来处理这类问题。如果您在Windows机器上,将其设置为true,那么当您pull代码时,将LF结尾转换为CRLF。

  • 第二行:如果您使用的是Linux或Mac系统,那么当您pull文件时,您不希望Git自动转换它们; 然而,如果你的Windows猪队友把未经处理带CRLF格式的文件push到远程代码库,那么你可能希望Git来自动解决这个问题。可以通过将core.autocrlf设置为input来告知Git将CRLF转换为LF。

  • 第三行:如果你是Windows程序员,只执行一个Windows项目或者所团队都是用windows系统甚至服务器都用windows,那么您可以关闭此功能,通过将配置值设置为false,将回车记录在存储库中。

core.safecrlf

core.safecrlf也有三个值,默认是 false。这个配置用来决定add代码时是否禁止提交混合换行符的文本文件。

// 禁止提交混合换行符的文本文件(git add 的时候会被拦截,提示异常)
git config --global core.safecrlf true

// 提交混合换行符的文本文件的时候发出警告,但是不会阻止 git add 操作
git config --global core.safecrlf warn

//  默认配置,不禁止提交混合换行符的文本文件
git config --global core.safecrlf false

延深知识

上面的两个配置文件都是个人在本机的个性化设置,如果对于比较大的项目,多人协作的情况下不可能让每个人都去更改一下自己的配置,这个时候我们就可以在项目的根目录下添加一个.gitattributes文件,它的优先级高于core.autocrlf配置,它类似于 .gitignore 文件,随提交修改生效,一个项目中可以维持一份相同的配置。 当然,.gitattributes文件可不只有配置换行符,还有一些其他的复杂配置。 具体更深入的了解就等以后遇到了再去探究吧。

 

参考文章:

https://www.dazhuanlan.com/2020/01/31/5e33b9fc22619

https://www.jianshu.com/p/c7236befe234

https://www.cnblogs.com/outs/p/6909567.html

https://blog.csdn.net/qq_40829288/article/details/97344376

https://www.cnblogs.com/huoqs/p/10432442.html

 

你可能感兴趣的:(Git)