平时在使用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
,即\r\n
来表示换行,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
两个配置项来供开发者自由配置。两者都支持全局
、本地
设置。
1 | git config --global core.autocrlf [true | input | false] #全局设置 |
core.autocrlf
core.autocrlf
有三个值,默认是 true
。这个配置用来决定要不要转换,怎么转换。
1 | // 默认设置,拉取时转换为CRLF,提交时转换为LF |
core.safecrlf
core.safecrlf
也有三个值,默认是 false
。这个配置用来决定add
代码时是否禁止提交混合换行符的文本文件。
1 | // 禁止提交混合换行符的文本文件(git add 的时候会被拦截,提示异常) |
延深知识
上面的两个配置文件都是个人在本机的个性化设置,如果对于比较大的项目,多人协作的情况下不可能让每个人都去更改一下自己的配置,这个时候我们就可以在项目的根目录下添加一个.gitattributes
文件,它的优先级高于core.autocrlf
配置,它类似于 .gitignore
文件,随提交修改生效,一个项目中可以维持一份相同的配置。 当然,.gitattributes
文件可不只有配置换行符,还有一些其他的复杂配置。 具体更深入的了解就等以后遇到了再去探究吧。