处理Git项目当中既有Windows文件又有Linux/Unix/MacOS文件的问题
我们一般在处理git的line ending时,一般会把core.autocrlf设置为input模式:
$ git config --global core.autocrlf
input
input模式的含义是:不管当前工作目录下的文本文件使用的eol(end of line)是'CRLF'还是'LF‘,commit回库是,都会转化为'LF'。这样,保证了在git的仓库中的代码使用的eol都是'LF'。这样对于Unix(以及Linux和MacOS)环境下是适用的。
但有的时候,我们的代码仓库可能同时包含Windows环境下和Unix使用的文件,比如Gradle项目就是很好的例子,它同时包含Windows的.BAT文件和Linux的脚本文件:
$ tree
.
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
2 directories, 5 files
在这种情况下,很显然gradlew.bat应该是保持'crlf'的eol,commit进库是不应该被转化为'lf'。如果我们强行签入,git也会报错:
$ git add *
fatal: CRLF would be replaced by LF in gradlew.bat.
因此,我们需要一种机制,让git对gradlew.bat做特殊处理。解决的方法就是在项目中添加一个.gitattributes[1]文件,文件内容如下:
$ cat ./.gitattributes
*.bat -text
这样,我们把*.bat文件标记为"-text",git也就不会把这类文件识别成代码文件,也就不再自动处理这类文件的eol,而是保持它本来的样子签入。我们可以看到加入了.gitattributes和相关配置以后,git可以正确添加.bat文件,不再报错:
关于更多git的eol设置问题,可以参考这篇文章:
[1] https://help.github.com/articles/dealing-with-line-endings/