处理Git项目当中既有Windows文件又有Linux/Unix/MacOS文件的问题

写这篇文章的目的主要是为了解决gradle项目里面既有BAT文件又有shell脚本的问题。

我们一般在处理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做特殊处理。解决的方法就是在项目中添加一个.gitattributes1文件,文件内容如下:

$ cat ./.gitattributes
*.bat -text

这样,我们把*.bat文件标记为-text,git也就不会把这类文件识别成代码文件,也就不再自动处理这类文件的EOL,而是保持它本来的样子签入。因此加入了.gitattributes的相关配置以后,git就可以正确添加.bat文件,不再报错。

  1. https://help.github.com/articles/dealing-with-line-endings/