平时在使用hexo
写博客,提交发布的时候,总会在命令行报warning
,大量的CRLF
、LF
、CR
等字眼,而在使用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.autocrlf
和core.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