首先,要理解的一点是,对于不同的操作系统,对于换行符的表示是不一样的,也就是说在编辑一个文件时,当我们敲下一个回车键的时候,对于不同的操作系统保存到文件中的换行符是不一样的。
如下表所示
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 已经改成和Linux\Unix一样,使用 LF)
问题:既然在不同的操作系统中,对于换行符会使用不同的表示形式,如果一个团队在开发一个共同的项目时,有人使用的是windows系统,有人使用的是Mac,当使用git协同开发软件时,就会出现换行符不统一的问题。
虽然在不同的操作平台中,默认的换行符表示形式不一样,但是可以在编辑器中设置在敲下回车键的时候保存的换行符是怎样的形式。比如在vs code中就可以直接点击编辑器右下角的 LF 或者是 CRLF 进行切换,设置成功后,再次敲入回车键,保存在文件中的换行符就是设置的那个形式。
git 为了解决上面提出的问题,会自动对换行符进行转换,转换的方案有三种:
设置 autocrlf
属性,在控制台中直接运行如下的一条命令就可以设置了。
// 提交时 CRLF 转换为 LF ,检出时转换为 CRLF
git config --global core.autocrlf true
// 提交时 CRLF 转换为 LF ,检出时不做任何的转换
git config --global core.autocrlf input
// 提交和检出均不做任何的转换
git config --global core.autocrlf false
上述的命名运行之后,会修改 .gitconfig 文件。
一般在项目中,为了避免项目同时出现 CRLF 和 LF ,还可以开启git 的 safecrlf 检查。当然,如果项目中定义了语法检测规则,例如使用 eslint 去约束换行符必须是 LF ,那么当你的文件中出现 CRLF 的时候, eslint 会给你错误语法提示信息,告诉你不能包含 CRLF ,这时候,不开启 saferlf 也是没有问题的(一般建议开启)。
开启方法如下第一条命名:
// 拒绝提交包含混合换行符的文件 (一般设置为true)
git config --global core.safecrlf true
// 允许提交包含混合换行符的文件
git config --global core.safecrlf false
// 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
上述命令运行之后,也会修改 .gitconfig 文件
注意点: .gitattributes 是针对一个单一的仓库的,也就是说每一个代码仓库都可以包含一个 .gitattributes 文件。这种方式设置之后,不需要一个项目组里面的同事分别再去修改自己电脑的git的全局配置。
对于通过 .gitattributes 设置换行符的转换方案,可以使用的命令如下:
1. text=auto : 采用git认为最好的方式来处理文件的换行符,
在 .gitattributes 中的默认配置项是按照这种方式处理的。
(如果是文本文件,则在文件入Git库时,行尾自动转换为LF。
如果已经在入Git库中的文件的行尾是CRLF,则文件在入Git库时,不再转换为LF。)
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文件必须要提交之后才能生效。
示例:
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto
# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text
# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
打开右上角的文件->首选项->设置-> 输入eol进行设置即可。