在你经过github或者其余远程托管服务器来和其余人进行协同开发代码的时候,确保换行符被正确处理是一项很重要的事。首先,你须要知道不一样的操做系统对换行符的定义会有所不一样,Unix或类Unix操做系统的换行符叫作LF,而windows系统的叫作CRLF,两者具备很大的区别:html
Unix系统里,每行结尾只有“<换行>”,即"n";Windows系统里面,每行结尾是“<换行><回车>”
Note:引自回车(CR)与换行(LF), 'r'和'n'的区别.git
这就是形成问题的根源——即若是你使用的是windows系统,而你的小伙伴用的是Mac的话,当大家使用git协同开发软件时,就会出现换行符不统一的问题。github
git其实能够本身处理换行符不统一的问题,可是可能会产生意想不到的结果。所以,有必要进行相关的配置,咱们一般有两种方案:windows
通常若是你不想麻烦的话,能够采用比较简单的方法,以下所示:服务器
$ git config --global core.autocrlf true
其实,在你安装windows版本的git或者torgoiseGit时,你可能已经进行过这样的配置,也许你当时并未知道那个选项是什么意思。下面这张图是否是有些眼熟呢?spa
Note:本图片来自百度经验:http://jingyan.baidu.com/arti...。操作系统
不过,也许不少人安装git的时候,是一直next...next吧!其实上面写得很清楚:code
当检出文本文件时,Git会将LF转换为CRLF。当提交文本文件时,CRLF将会被转换为LF。对于跨平台的项目,这是对Windows系统的推荐设置。("core.autocrlf" is set to "true")orm
当检出文本文件时,Git不会作任何转换。当提交文本文件时,CRLF将会被转换为LF。对于跨平台的项目,这是对Unix系统的推荐设置。("core.autocrlf" is set to "input")htm
不管是检出仍是提交文本文件时,Git都不会作任何转换。对于跨平台的项目,不推荐采用该选项。
显然,第一个选项就是咱们所介绍的第一种方法。
顺便吐槽一下,我在网上看到不少介绍如何安装Git的博客,不多有详细说明每个安装步骤的,有些甚至直接说
一直next下去就安装完成了。
一方面缘由就是他们也不知道,其实这样可能会对新手产生误导,并且未免有些不负责任。
固然,有更好的方法解决换行符不统一的问题——使用.gitattributes
文件统一换行符。这种方法是针对某个仓库进行换行符的统一配置,即时你已经进行了全局配置。
另外,这个文件有点儿相似于.gitignore
,不只名字很相似,使用方式,编写语法也很像。这个文件必须位于仓库的根目录,能够像其余文件同样进行修改、提交。下面介绍如何编写这个文件:
文件内容看起来像一张表格,总共分为两列:左边一列是git要匹配的文件名;右边是git须要采用的换行符格式。下面咱们来看一个栗子:
# 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
若是你熟悉.gitignore
的话,你会以为上面这个文件的左边一列很熟悉,这里咱们就再也不赘述了,不熟悉的话,请自行查阅相关资料。惟一的不一样就是.gitattributes
文件多了右边一列,如text
, text eol=crlf
, binary
,刚刚咱们也说过这一列是用来设置左边对应文件使用的换行符格式的,左右两列用空格隔开。下面咱们来详细介绍下右边一列的语法:
text=auto
让git自行处理左边匹配的文件使用何种换行符格式,这是默认选项。
text eol=crlf
对左边匹配的文件统一使用CRLF换行符格式,若是有文件中出现LF将会转换成CRLF。
text eol=lf
对左边匹配的文件统一使用LF换行符格式,若是有文件中出现CRLF将会转换成LF。
binary
告诉git这不是文本文件,不该该对其中的换行符进行改变。另外,binary
和符号-text -diff
是等价的。
上面这些语法应该已经足够了,若是有兴趣的,能够自行查阅相关资料,好比官方的资料:https://git-scm.com/book/en/v...。
也许你在看完个人博客以后,才意识到本身并未进行相关的设置抑或是你想修改换行符配置,因而你兴致勃勃地按照个人博客进行了配置,结果你发现出了一堆莫名其妙的警告或者错误。
怪我喽?
不要着急吐槽,兵来将挡,水来土掩,没有解决不了的问题!
# 在仓库的根目录下运行命令 $ git add . -u $ git commit -m "Saving files before refreshing line endings"
$ git rm --cached -r .
$ git reset --hard
$ git add . # 出现"warning: CRLF will be replaced by LF in file."的警告是很正常的现象
$ git commit -m "Normalize all the line endings"